哪位大神帮忙给看看,郁闷了一下午了太气人了!
```
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])
}
}
```