郁闷了一下午了,传个参怎么遇到这么古怪的事情了!!!(已经解决)

bsdx866 · 2023-09-04 15:57:14 · 1803 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-09-04 15:57:14 的主题,其中的信息可能已经有所发展或是发生改变。

哪位大神帮忙给看看,郁闷了一下午了太气人了!

func Upload(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(1024)
    _, _, err := r.FormFile("upload")
    if err != nil {
        w.Write([]byte("文件上传错误"))
        return
    }
    for _, fileHead := range r.MultipartForm.File["upload"] {
        file, err := fileHead.Open()
        if err != nil {
            log.Println("没有接收到文件", err)
            return
        }
        defer file.Close()
        buf := make([]byte, 512)
        file.Read(buf)
        objContentType := http.DetectContentType(buf) //用这个就报错
        // objContentType := "application/pdf"  用这个就没问题
        miniolib.UploadObj(fileHead.Filename, file, fileHead.Size, objContentType)
    }
}

下面这个是UploadObj的写法

func UploadObj(objectName string, fp io.Reader, size int64, opt string) {
    object, err := client.PutObject(context.Background(), bucketName, objectName, fp, size, minio.PutObjectOptions{ContentType: opt})
    if err != nil {
        log.Println("上传失败:", err)
        return
    }
    log.Printf("文件上传成功 %s of 文件大小为: %d\n", objectName, object.Size)
}

原因是因为file.Read读取了512个字节作为判断contentType的类型,再上传数据的时候file的完整性就没有了,所以会提示错误。 正确的写法是下面的:

func Upload(w http.ResponseWriter, r *http.Request) {
    err := r.ParseMultipartForm(1024)
    if err != nil {
        w.Write([]byte("没有上传文件,请重试"))
        return
    }
    for _, fileHead := range r.MultipartForm.File["upload"] {
        file, err := fileHead.Open()
        if err != nil {
            log.Println(err)
            return
        }
        defer file.Close()
        objContentType := fileHead.Header["Content-Type"]
        miniolib.UploadObj(fileHead.Filename, file, fileHead.Size, objContentType[0])
    }
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1803 次点击  ∙  1 赞  
加入收藏 微博
1 回复  |  直到 2023-09-05 14:37:47
ling_
ling_ · #1 · 2年之前

很正常吧,file.Read后,文件读取会偏移至第512个字节,用seek函数复位一下就行了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传