flipped-aurora/gin-vue-admin · warning

invalid plugin archive name

Error message

invalid plugin archive name

What it means

installSubPlugin validates the uploaded file's basename before writing it under tempDir: if the trimmed filename base is '.' or a path separator, there is no usable archive name, so it returns 'invalid plugin archive name'. This blocks empty/degenerate multipart filenames from creating bad temp paths.

Source

Thrown at server/service/system/auto_code_plugin.go:183

	}
	if err = os.MkdirAll(serverRoot, 0755); err != nil {
		return -1, -1, err
	}
	tempDir, err := os.MkdirTemp(serverRoot, "gva-plugin-")
	if err != nil {
		return -1, -1, err
	}
	defer os.RemoveAll(tempDir)

	src, err := file.Open()
	if err != nil {
		return -1, -1, err
	}
	defer src.Close()

	archiveName := filepath.Base(strings.TrimSpace(file.Filename))
	if archiveName == "." || archiveName == string(filepath.Separator) {
		return -1, -1, errors.New("invalid plugin archive name")
	}
	archivePath, err := utils.JoinWithinRoot(tempDir, archiveName)
	if err != nil {
		return -1, -1, err
	}
	out, err := os.Create(archivePath)
	if err != nil {
		return -1, -1, err
	}
	if _, err = io.Copy(out, src); err != nil {
		out.Close()
		return -1, -1, err
	}
	if err = out.Close(); err != nil {
		return -1, -1, err
	}

	paths, err := utils.Unzip(archivePath, tempDir)

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Re-send the multipart request ensuring the filename is a real archive name, e.g. curl -F 'file=@myplugin.zip'.
  2. On the client, validate the selected file has a non-empty name ending in .zip before upload.
  3. Server-side, reject earlier at the API layer with a clearer message when file.Filename is blank.

Example fix

// before
body.append('file', blob)            // no filename -> invalid
// after
body.append('file', blob, 'myplugin.zip')
// or
formData.append('file', fileInput.files[0], fileInput.files[0].name)
Defensive patterns

Strategy: validation

Validate before calling

const name = file.name?.trim()
if (!name || name === '.' || name === '/' || name === '\\') {
  throw new Error('invalid plugin archive name')
}

Type guard

function hasValidArchiveName(file) {
  const n = (file?.name ?? '').trim()
  return n.length > 0 && n !== '.' && n !== '/' && n !== '\\'
}

Try / catch

web, server, err := pluginService.Install(file)
if err != nil && err.Error() == "invalid plugin archive name" {
    return fmt.Errorf("上传文件缺少有效文件名,请在 multipart 中指定 filename: %w", err)
}

Prevention

When it happens

Trigger: Uploading a sub-plugin archive via the sub-plugin install API with file.Filename empty, whitespace-only, '.', '/', or only separators — often from a programmatic client omitting filename in multipart/form-data.

Common situations: Custom scripts or SDK calls building multipart bodies without setting the filename part; browser edge cases where a directory was 'uploaded'; proxies stripping Content-Disposition filenames.

Related errors


AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31). Data as JSON: /api/errors/4e325ef89849be4f. Report an issue: GitHub.