首页 > 解决方案 > golang 将文件发布到烧瓶服务器

问题描述

我尝试创建应用程序,它将文件从页面上的表单发送到 golang 服务器,并将其重新发送到烧瓶服务器。

我的 golang 服务器:

func api_upload_model(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(50 << 20)
    file, handler, err := r.FormFile("Model")
    if err != nil {
        fmt.Println("Error Retrieving the File")
        fmt.Println(err)
        return
    }
    fmt.Printf("Uploaded File: %+v\n", handler.Filename)
    fmt.Printf("File Size: %+v\n", handler.Size)
    
    resp, err := http.Post(*URL here*, "multipart/form-data", file)
    if err != nil {
        fmt.Println("Error Sending the File")
        fmt.Println(err)
        return
    }
    w.Header().Set("Content-Type", "text/html")
    buffer, _ := ioutil.ReadAll(resp.Body)
    _, err = w.Write(buffer)
    if err != nil {
        fmt.Println("Error Sending the File")
        fmt.Println(err)
        return
    }
}

func main() {
    router := chi.NewRouter()
    router.Post("/api/upload_model", api_upload_model)
    http.ListenAndServe(":8080", router)
}

烧瓶处理程序:

@app.route('/upload_model', methods=['POST'])
def upload_model():
    log("Inference server", "123")
    name = request.args.get('name', None)
    if name is None:
        return "Error: bad request parameters."
    print(str(request))
    if 'file' not in request.files: #I know that I don't set filename to 'file' but request.files is empty anyway
        return "No file"
    file = request.files['file']
    if file:
        filename = secure_filename(name)
        file.save(os.path.join("data/models", name))
        return "200"

我从烧瓶服务器得到的:

<Request 'http://*URL here*/upload_model?name=1.jpg' [POST]>: 

我试图打印 request.files: 它是空的。所以,golang 服务器不发送文件或烧瓶服务器没有得到它。

Golang 版画

Uploaded File: 1.jpg
File Size: 114940

所以它接收文件。

UPD:找到了这个答案:How to redirect multipart POST request to a second server in Golang? 并让我的golang服务器像那里一样。现在它不解析文件,而是将整个请求发送到未编辑的烧瓶服务器。而且更容易。

标签: goflask

解决方案


您不能直接将FormFile作为输入传递给 post 方法,而是需要创建一个包含该文件的多部分对象。

查看示例 如何在 golang 中使用 multipart


推荐阅读