2017-08-07 7 views
1

経由GoLangは、だから私は、私にPOSTリクエストを介してメイン機能(ファイルのアップロード)で立ち往生しています...私はGoLang言語で新しいです、と私は、ファイルのアップロードのためのREST APIのWebServerを作成したい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.私は2番目のエラー=>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

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

を作成し、それがすでに存在する場合 はそれを切り捨て、(umaskの前)モード0666での名前のファイルが作成されます作成します。成功した場合は、返されたFileのメソッドをI/Oに使用することができます( )。関連するファイル記述子は モードO_RDWRです。エラーがある場合、* PathError型になります。で述べたようにのOpenFileを使用して も:例として、新しいハンドラを作った

EDIT 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årlindthanks !!!!出来た!!!! – vladimir

3

multipart.Writerは、マルチパートメッセージを生成し、これはものではありませんクライアントからファイルを受信して​​ディスクに保存する場合に使用します。

クライアントからファイルをアップロードしているとします。Content-Type: application/x-www-form-urlencodedの場合はr.Form.Getの代わりにFormFileを使用し、*multipart.Fileの値を返し、クライアントが送信したファイルの内容と、そのコンテンツをio.Copyでディスクに書き込むのに使用できます。

+0

@mkporiva、はい、今私はそれを使用しており、完璧に動作します! – vladimir

関連する問題