2015-05-06 40 views
4

在服務器端我使用Python瓶:OkHttp上傳多個文件名到Python瓶服務器

from flask import Flask, request 
app = Flask(__name__) 

@app.route("/upload", methods=["POST"]) 
def upload(): 
    print request.files 
    print request.form 
    return "200 ok" 

if __name__ == '__main__': 
    app.run(port=5000) 

Java測試代碼塊:

public void test_Upload() throws Exception{ 
     MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); 
     MediaType MEDIA_TYPE_XO = MediaType.parse("image/png"); 
     RequestBody requestBody = new MultipartBuilder() 
       .type(MultipartBuilder.FORM) 
       .addPart(
         Headers.of("Content-Disposition", "form-data; name=\"title\""), 
         RequestBody.create(null, "Square Logo")) 
       .addPart(
         Headers.of("Content-Disposition", "form-data; name=\"image\""), 
         RequestBody.create(MEDIA_TYPE_PNG, new File("/Users/lollipop/Downloads/ic_launch.png"))) 
       .addPart(
         Headers.of("Content-Disposition", "form-data; name=\"google\""), 
         RequestBody.create(MEDIA_TYPE_XO, new File("/Users/lollipop/Downloads/google-logo.png"))) 
       .build(); 
     Request request = new Request.Builder() 
       .url("http://localhost:5000/upload") 
       .post(requestBody) 
       .build(); 
     Response resp = httpClient.newCall(request).execute(); 
     System.out.println(resp.body().string()); 
    } 

我運行測試。服務器端無法讀取request.forms

輸出的文件服務器上:

ImmutableMultiDict([]) 
ImmutableMultiDict([('image', u'5 ...many data ... fffd'), ('google', u'5i\u ...many data ... fffd'),('title', u'Square Logo')]) 

爲什麼我的文件上傳到request.formrequest.files。並且所有的二進制文件數據都被解析爲unicode字符串。

接下來,我測試了Python請求。如下代碼:

resp = requests.post("http://localhost:5000/upload", 
         files={ 
          "image": open("/Users/lollipop/Downloads/ic_launch.png", "rb"), 
          "title": open("/Users/lollipop/Downloads/ic_launch.png", "rb"), 
          "google": open("/Users/lollipop/Downloads/google-logo.png", "rb") 
         }) 

而服務器端輸出相反:

ImmutableMultiDict([('image', <FileStorage: u'ic_launch.png' (None)>), ('google', <FileStorage: u'google-logo.png' (None)>), ('title', <FileStorage: u'ic_launch.png' (None)>)]) 
ImmutableMultiDict([]) 

的上傳文件是request.filesrequest.form,這是我預期的結果。

所以。如何使用OkHttp將文件上傳到燒錄服務器,並使用request.files進行回放。

更新

request是瓶requst。

from flask import request 

requests是一個Python http客戶端庫。

+0

您能顯示發出的請求嗎? - 爲了知道錯誤在哪一邊:Java或Python。 – User

回答

0

這個bug不是燒瓶。我被這個誤導了answer

在OkHttp文檔中。說明後一個文件中使用下面的代碼

public static final MediaType MEDIA_TYPE_MARKDOWN 
     = MediaType.parse("text/x-markdown; charset=utf-8"); 

    private final OkHttpClient client = new OkHttpClient(); 

    public void run() throws Exception { 
    File file = new File("README.md"); 

    Request request = new Request.Builder() 
     .url("https://api.github.com/markdown/raw") 
     .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file)) 
     .build(); 

    Response response = client.newCall(request).execute(); 
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 

    System.out.println(response.body().string()); 
    } 

實際上,這種方式是不是錯誤,它張貼您不需要提供文件名和其他形式的數據的文件。 但這不是一個常用的用法。

我們經常需要上傳一個具有指定名稱和一些鍵值表單數據的文件。我們甚至需要上傳多個文件。

RequestBody requestBody = new MultipartBuilder() 
       .type(MultipartBuilder.FORM) 
       .addFormDataPart("username", username) 
       .addFormDataPart("password", password) 
       .addFormDataPart("avatar", "avatar.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile)) 
       .addFormDataPart("introduce_image", "introduce_image.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile)) 
       .build();