9

golang でアップロードしたファイルへのアクセスに問題があります。私はこの言語に本当に慣れていないので、何度か試してみましたが、オンラインでも答えが見つかりません。

私は何を間違っていますか?このコードでは、アップロードされたファイルの数をリストするブロックに到達しません。

func handler(w http.ResponseWriter, r *http.Request) {
  fmt.Println("handling req...")

  if r.Method =="GET"{
    fmt.Println("GET req...")

  } else {

    //parse the multipart stuff if there
    err := r.ParseMultipartForm(15485760)

    //
    if err == nil{
        form:=r.MultipartForm
        if form==nil {
            fmt.Println("no files...")

        } else {
            defer form.RemoveAll()
            // i never see this actually occur
            fmt.Printf("%d files",len(form.File))
        }
    } else {
        http.Error(w,err.Error(),http.StatusInternalServerError)
        fmt.Println(err.Error())
    }
  }

  //fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
  fmt.Println("leaving...")
}

アップデート

上記のコードを動作させることができました。これは素晴らしいことです。以下の回答は、非同期で行う方法を示しています。これは、私のコード サンプルよりも優れている可能性があります。

4

2 に答える 2

12

回答 最新の golang リリースをダウンロードします。

古いgolangバージョンを使用して以前に問題を経験しましたが、何が起こったのかわかりませんが、最新のgolangでは機能しています。=)

以下のアップロード ハンドラ コード...完全なコード: http://noypi-linux.blogspot.com/2014/07/golang-web-server-basic-operatons-using.html

  // parse request  
  const _24K = (1 << 10) * 24  
  if err = req.ParseMultipartForm(_24K); nil != err {  
       status = http.StatusInternalServerError  
       return  
  }  
  for _, fheaders := range req.MultipartForm.File {  
       for _, hdr := range fheaders {  
            // open uploaded  
            var infile multipart.File  
            if infile, err = hdr.Open(); nil != err {  
                 status = http.StatusInternalServerError  
                 return  
            }  
            // open destination  
            var outfile *os.File  
            if outfile, err = os.Create("./uploaded/" + hdr.Filename); nil != err {  
                 status = http.StatusInternalServerError  
                 return  
            }  
            // 32K buffer copy  
            var written int64  
            if written, err = io.Copy(outfile, infile); nil != err {  
                 status = http.StatusInternalServerError  
                 return  
            }  
            res.Write([]byte("uploaded file:" + hdr.Filename + ";length:" + strconv.Itoa(int(written))))  
       }  
  }  
于 2014-07-21T09:27:37.173 に答える
5

ファイルアップロードのキーがわかっている場合は、少し簡単にできると思います(これはテストされていません):

infile, header, err := r.FormFile("file")
if err != nil {
    http.Error(w, "Error parsing uploaded file: "+err.Error(), http.StatusBadRequest)
    return
}

// THIS IS VERY INSECURE! DO NOT DO THIS!
outfile, err := os.Create("./uploaded/" + header.Filename)
if err != nil {
    http.Error(w, "Error saving file: "+err.Error(), http.StatusBadRequest)
    return
}

_, err = io.Copy(outfile, infile)
if err != nil {
    http.Error(w, "Error saving file: "+err.Error(), http.StatusBadRequest)
    return
}

fmt.Fprintln(w, "Ok")
于 2014-12-24T15:00:35.783 に答える