douju1997 2019-03-04 18:59
浏览 35
已采纳

无法发布多个文件

I know how to upload a single file but now I'm trying to upload multiple files in the same Go function.

Here is my code:

func PhotoCreatePOST(w http.ResponseWriter, r  *http.Request) {
    var err error

r.ParseMultipartForm(32 << 20) // 32MB is the default used by FormFile
fhs := r.MultipartForm.File["files"]

var fileNames []string
var filename string
var ext string
for _, file := range fhs { //Iterate over multiple uploaded files
    if err != nil {
        log.Fatal(err)
    } else {
        dir, err := os.Getwd()
        if err != nil {
            log.Fatal(err)
        }
        ext = strings.ToLower(path.Ext(file.Filename))

        filename = path.Join(random.RandString(10) + ext)

        destFolder := "/media/photos"
        if _, err := os.Stat(destFolder); os.IsNotExist(err) {
            os.Mkdir(destFolder, 0755)
        }

        //destination Path. The string which is Saving in DB
        savePath := destFolder + "/" + filename

        err = ioutil.WriteFile(savePath, file, 0777) //<--Here is the problem
        if err != nil {
            log.Println(err)
            io.WriteString(w, err.Error())
            return
        }

    }
}

//Add file url to the slice
fileNames = append(fileNames, filename)

}

But I get this error:

cannot use file (type *multipart.FileHeader) as type []byte in argument to ioutil.WriteFile

I've tried to read the file into bytes like this:

b, err := ioutil.ReadFile(file) 
    if err != nil {
        fmt.Print(err)
    }

And save b instead of file.

But then I get another error that

can not read *multipart.Fileheader as string 

How can I fix this?

  • 写回答

2条回答 默认 最新

  • drf97973 2019-03-05 17:27
    关注

    Alright, thanks to this great blog post, I found my answer and here it the complete solution for the record:

    // PhotoCreatePOST saves multiple photo uploads
    func PhotoCreatePOST(w http.ResponseWriter, r *http.Request) {
    
    
        err := r.ParseMultipartForm(100000)
        if err != nil {
            fmt.Println("error parsing multiplepart form", err)
            return
        }
    
        files := r.MultipartForm.File["files"]
    
        for i, _ := range files { //Iterate over multiple uploaded files
    
            file, err := files[i].Open()
            defer file.Close()
            if err != nil {
                fmt.Println("error opening file ", err)
                return
            }
    
            ext := path.Ext(files[i].Filename)
    
            //TODO: Verify extension is valid
    
            filename := GetRandomString(10) + ext
    
            //create destination file making sure the path is writeable.
            dst, err := os.Create("media/photos/" + filename)
            defer dst.Close()
            if err != nil {
                fmt.Println("error creating destination ", err)
                return
            }
    
            //copy the uploaded file to the destination file
            if _, err := io.Copy(dst, file); err != nil {
                fmt.Println("error copying file", err)
                return
            }
    
            fmt.Println("Image upload success: ", files[i].Filename)
        }
    
        fmt.Println("all are uploaded")
    
        PhotoCreateGET(w, r)
        return 
    
    }
    
    //Generate random filename (never trust user input!)
    var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789")
    
    // GetString returns a random string
    func GetRandomString(n int) string {
        rand.Seed(time.Now().UnixNano())
        b := make([]rune, n)
        for i := range b {
            b[i] = letterRunes[rand.Intn(len(letterRunes))]
        }
        return string(b)
    }
    

    And the upload form:

    <form method="post" action="/create/photo" enctype="multipart/form-data">
            <input type="file"  name="files"  multiple>
            <input type="hidden" name="token" value="{{.token}}">
            <button title="submit" type="submit" >Save </button>
    </form>
    

    Voila. Hopefully it can save some time for others.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟