flipped-aurora/gin-vue-admin · error

function file.Open() failed, err:

Error message

function file.Open() failed, err:

What it means

UploadFile for Qiniu failed when calling file.Open() on the *multipart.FileHeader — the uploaded multipart part could not be opened into a readable file handle before being handed to the qiniu form uploader. This is an application/I-O level failure of the multipart reader, not a Qiniu network error; the message embeds the underlying open error text.

Source

Thrown at server/utils/upload/qiniu.go:42

//@function: UploadFile
//@description: 上传文件
//@param: file *multipart.FileHeader
//@return: string, string, error

func (*Qiniu) UploadFile(ctx context.Context, file *multipart.FileHeader) (string, string, error) {
	putPolicy := storage.PutPolicy{Scope: global.GVA_CONFIG.Qiniu.Bucket}
	mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
	upToken := putPolicy.UploadToken(mac)
	cfg := qiniuConfig()
	formUploader := storage.NewFormUploader(cfg)
	ret := storage.PutRet{}
	putExtra := storage.PutExtra{Params: map[string]string{"x:name": "github logo"}}

	f, openError := file.Open()
	if openError != nil {
		logger.WithCtx(ctx).Mod("upload").Err(openError).Error("function file.Open() failed")

		return "", "", errors.New("function file.Open() failed, err:" + openError.Error())
	}
	defer f.Close()                                                  // 创建文件 defer 关闭
	fileKey := fmt.Sprintf("%d%s", time.Now().Unix(), file.Filename) // 文件名格式 自己可以改 建议保证唯一性
	putErr := formUploader.Put(context.Background(), &ret, upToken, fileKey, f, file.Size, &putExtra)
	if putErr != nil {
		logger.WithCtx(ctx).Mod("upload").Err(putErr).Error("function formUploader.Put() failed")
		return "", "", errors.New("function formUploader.Put() failed, err:" + putErr.Error())
	}
	return global.GVA_CONFIG.Qiniu.ImgPath + "/" + ret.Key, ret.Key, nil
}

//@author: [piexlmax](https://github.com/piexlmax)
//@author: [ccfish86](https://github.com/ccfish86)
//@author: [SliverHorn](https://github.com/SliverHorn)
//@object: *Qiniu
//@function: DeleteFile
//@description: 删除文件
//@param: key string

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Check the embedded openError in the log line 'function file.Open() failed' for the root cause (e.g. http: unexpected EOF).
  2. Verify server temp/storage space and permissions for multipart temp files.
  3. Check proxy (nginx `client_max_body_size`) and Gin multipart memory limits vs your file sizes.
  4. Ensure no middleware consumes the request body before the upload handler reads it.
  5. Retry the upload from the client; a disconnected client also yields this failure.
Defensive patterns

Strategy: try-catch

Validate before calling

// before calling the uploader, verify the header is readable
fh, err := header.Open()
if err != nil {
    return fmt.Errorf("uploaded file unreadable: %w", err)
}
fh.Close()

Try / catch

path, key, err := q.UploadFile(ctx, fileHeader)
if err != nil {
    if strings.Contains(err.Error(), "file.Open() failed") {
        logger.Error("multipart read failed (client disconnect or disk issue): %v", err)
        c.JSON(400, gin.H{"code": 7, "msg": "文件读取失败,请重新上传"})
        return
    }
    c.JSON(500, gin.H{"code": 7, "msg": "上传失败"})
}

Prevention

When it happens

Trigger: Calling Qiniu.UploadFile when multipart.FileHeader.Open() errors: the request body was already consumed or truncated, multipart parsing limits exceeded, temp-file read failure (disk full, permissions), or client disconnected mid-upload.

Common situations: Reverse proxy (nginx) aborting large uploads, server tmp dir full or read-only, mismatched multipart form handling that drained the reader earlier, client timeouts canceling the request body.

Related errors


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