2017-08-07 198 views
1

我GoLang語言是新的,我要創建文件上傳REST API的WebServer ...GoLang通過POST請求發送文件

所以我通過POST請求停留在主要功能(文件上傳)到我的服務器...

我這行調用上傳功能

router.POST("/upload", UploadFile) 

,這是我上傳功能:

func UploadFile(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { 
    io.WriteString(w, "Upload files\n") 
    postFile(r.Form.Get("file"), "/uploads") 
} 

func postFile(filename string, targetUrl string) error { 
    bodyBuf := &bytes.Buffer{} 
    bodyWriter := multipart.NewWriter(bodyBuf) 

    // this step is very important 
    fileWriter, err := bodyWriter.CreateFormFile("file", filename) 
    if err != nil { 
     fmt.Println("error writing to buffer") 
     return err 
    } 

    // open file handle 
    fh, err := os.Open(filename) 
    if err != nil { 
     fmt.Println("error opening file") 
     return err 
    } 

    //iocopy 
    _, err = io.Copy(fileWriter, fh) 
    if err != nil { 
     panic(err) 
    } 

    bodyWriter.FormDataContentType() 
    bodyWriter.Close() 

    return err 

} 

但我看不到任何上傳的文件在我的/upload/目錄中...

那麼我做錯了什麼?

P.S我得到第二個錯誤=>error opening file,所以我認爲文件上傳或從UploadFile函數獲取文件有問題,我是對嗎?如果是的話,比我如何能夠從這個功能提取或獲取文件到postFile函數?

回答

2

os.Open將打開一個文件,因爲該文件不存在,您將收到一個錯誤。 使用os.Create代替它會創建一個新文件並將其打開。 (參考:https://golang.org/pkg/os/#Open

FUNC打開

func Open(name string) (*File, error)

開放打開了 讀取指定的文件。如果成功,返回文件上的方法可用於 閱讀;關聯的文件描述符具有模式O_RDONLY。如果有 錯誤,它將是* PathError類型。

功能建立

func Create(name string) (*File, error)

創建創建了模式0666(之前的umask), 命名的文件,如果它已經存在,截斷它。如果成功, 返回的文件方法可用於I/O;關聯的文件描述符有 模式O_RDWR。如果有錯誤,它將是* PathError類型。

編輯

做了一個新的處理程序爲例: 以及使用的OpenFile由提到:GoLang send file via POST request

func Upload(w http.ResponseWriter, r *http.Request) { 
    io.WriteString(w, "Upload files\n") 

    file, handler, err := r.FormFile("file") 
    if err != nil { 
     panic(err) //dont do this 
    } 
    defer file.Close() 

    // copy example 
    f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) 
    if err != nil { 
     panic(err) //please dont 
    } 
    defer f.Close() 
    io.Copy(f, file) 

} 
+1

https://golang.org/pkg/os/#OpenFile允許您比其他功能更精確的模式管理。 – bayrinat

+0

好的,但我怎麼能得到我發送到服務器的文件?因爲我可以創建文件,但它不一樣,我正在發送... – vladimir

+0

@FredrikMårlind謝謝!!!!有效!!!! – vladimir

3

multipart.Writer產生多消息,這不是您希望用於從客戶端接收文件並將其保存到磁盤。

假設您從客戶端上傳文件,例如一個瀏覽器,Content-Type: application/x-www-form-urlencoded您應該使用FormFile而不是r.Form.Get,它將返回一個*multipart.File值,其中包含客戶端發送的文件的內容,您可以使用它將該內容寫入磁盤,其中io.Copy或不包含該內容。

+0

@mkporiva,是的,現在我正在使用它,它工作完美! – vladimir