OkHttp上传文件,服务器端请求解析找不到文件信息的问题

长话短说,不深入解释了,官方给的上传案例代码:

  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,问题亦然。

找到了一个泡网同学的代码:

做了改动1:

  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任然找不到文件信息。

改动1的改动点是:文件的Header信息里面必须有上传文件的名字,当然这个名字其实是随便起的,一般后缀保持正确即可。

这个时候不得不再参考泡网同学的代码,做了修改2:

  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"改成了附件类型:

  1. "application/octet-stream"  

 最后借鉴StackOverFlow的某贴的代码:http://stackoverflow.com/questions/30707681/multipart-file-upload-with-okhttp-spring,

  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

原文地址:https://www.cnblogs.com/dhcn/p/7121330.html