OkHttp上傳文件,服務器端請求解析找不到文件信息的問題

長話短說,不深刻解釋了,官方給的上傳案例代碼:html

 

  1. private static final String IMGUR_CLIENT_ID = "...";  
  2.   private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");  
  3.   
  4.   private final OkHttpClient client = new OkHttpClient();  
  5.   
  6.   public void run() throws Exception {  
  7.     // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image  
  8.     RequestBody requestBody = new MultipartBuilder()  
  9.         .type(MultipartBuilder.FORM)  
  10.         .addPart(  
  11.             Headers.of("Content-Disposition", "form-data; name=\"title\""),  
  12.             RequestBody.create(null, "Square Logo"))  
  13.         .addPart(  
  14.             Headers.of("Content-Disposition", "form-data; name=\"image\""),  
  15.             RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))  
  16.         .build();  
  17.   
  18.     Request request = new Request.Builder()  
  19.         .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)  
  20.         .url("https://api.imgur.com/3/image")  
  21.         .post(requestBody)  
  22.         .build();  
  23.   
  24.     Response response = client.newCall(request).execute();  
  25.     if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);  
  26.   
  27.     System.out.println(response.body().string());  
  28.   }  

上面這個代碼上傳文件在Java服務器端用spring boot的 MultiPart解析不到上傳的文件,用Python Django,問題亦然。java

找到了一個泡網同窗的代碼:python

作了改動1:android

 

  1. RequestBody requestBody = new MultipartBuilder()  
  2.                 .type(MultipartBuilder.FORM)  
  3.                 .addPart(  
  4.                         Headers.of("Content-Disposition", "form-data; name=\"UserId\""),  
  5.                         RequestBody.create(null, UserId))  
  6.                 .addPart(  
  7.                         Headers.of("Content-Disposition", "form-data; name=\"SecurityCode\""),  
  8.                         RequestBody.create(null, SecurityCode))  
  9.                 .addPart(  
  10.                         Headers.of("Content-Disposition", "form-data; name=\"File\"; filename =\"avatar_upload.jpg\""),  
  11.                         RequestBody.create(MediaType.parse("image/jpeg"), file))  
  12.   
  13.   
  14.                 .build();  

改成以上代碼後,Django請求解析能夠找到文件了,Spring boot的multipart任然找不到文件信息。git

改動1的改動點是:文件的Header信息裏面必須有上傳文件的名字,固然這個名字實際上是隨便起的,通常後綴保持正確便可。github

這個時候不得再也不參考泡網同窗的代碼,作了修改2:web

 

  1. RequestBody requestBody = new MultipartBuilder()  
  2.                 .type(MultipartBuilder.FORM)  
  3.                 .addPart(  
  4.                         Headers.of("Content-Disposition", "form-data; name=\"UserId\""),  
  5.                         RequestBody.create(null, UserId))  
  6.                 .addPart(  
  7.                         Headers.of("Content-Disposition", "form-data; name=\"SecurityCode\""),  
  8.                         RequestBody.create(null, SecurityCode))  
  9.                 .addPart(  
  10.                         Headers.of("Content-Disposition", "form-data; name=\"File\"; filename =\"avatar_upload.jpg\""),  
  11.                         RequestBody.create(MediaType.parse("application/octet-stream"), file))  
  12.   
  13.                 .build();  


 這回Spring Boot multipart 依舊找不到文件信息了,這回的改動點是把mime類型由圖片類型"image/jpeg"改爲了附件類型:spring

  1. "application/octet-stream"  

 

 最後借鑑StackOverFlow的某貼的代碼:http://stackoverflow.com/questions/30707681/multipart-file-upload-with-okhttp-spring,api

 

  1. RequestBody body = new MultipartBuilder()  
  2.     .addFormDataPart("qqfile", filename, RequestBody.create(MediaType.parse("media/type"), new File(filename)))  
  3.     .type(MultipartBuilder.FORM)  
  4.     .build();  
  5.   
  6. Request request = new Request.Builder()  
  7.     .url("/path/to/your/upload")  
  8.     .post(body)  
  9.     .build();  
  10.   
  11. OkHttpClient client = new OkHttpClient();  
  12. Response response = client.newCall(request).execute();  


由於這個帖子的topic就是解決Spring MultiPart的問題,最後終於能夠上傳了,修改點在於完全修改了添加文件使用的函數接口,我在build gradle裏面已經準備用Apache HttpClient了。服務器

 

OkHttp有點坑爹啊。

 

 

參考:

https://github.com/square/okhttp/wiki/Recipes

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0824/3355.html

相關文章
相關標籤/搜索