zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    xcode6创建工程时 默认去掉了PrefixHeader.pch
    KVC访问私有成员
    Apple Watch 中Context Menu的应用
    Apple Watch应用创建
    NSURLConnection加载数据并展示
    UIView 的exclusiveTouch clipsToBounds和transform属性
    Shell的一些基本用法
    NS_ENUM和NS_OPTIONS
    iOS国际化时遇到错误: the data couldn't be read because it isn't in the correct format.
    iOS8中UIAlertController的使用
  • 原文地址:https://www.cnblogs.com/dhcn/p/7121330.html
Copyright © 2011-2022 走看看