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

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

上面这个代码上传文件在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. .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. .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. Request request = new Request.Builder()
  6. .url("/path/to/your/upload")
  7. .post(body)
  8. .build();
  9. OkHttpClient client = new OkHttpClient();
  10. 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

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

  1. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  2. JavaWeb实现文件上传下载功能实例解析 (好用)

    转: JavaWeb实现文件上传下载功能实例解析 转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web ...

  3. [CISCN2019 华北赛区 Day1 Web1]Dropbox-phar文件能够上传到服务器端实现任意文件读取

    0x00知识点 phar是什么: 我们先来了解一下流包装 大多数PHP文件操作允许使用各种URL协议去访问文件路径:如data://,zlib://或php://.例如常见的 include('php ...

  4. C# 应用 - 使用 WepApp 处理文件上传、下载请求

    1. 代码 /// <summary> /// 文件上传下载控制器 /// </summary> public class FileController : ApiContro ...

  5. Java上传下载excel、解析Excel、生成Excel

    在软件开发过程中难免需要批量上传与下载,生成报表保存也是常有之事,最近集团门户开发用到了Excel模版下载,Excel生成,圆满完成,对这一知识点进行整理,资源共享,有不足之处还望批评指正,文章结尾提 ...

  6. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  7. MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传

    本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件 ...

  8. 文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)--SNF快速开发平台3.0

    实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制, ...

  9. mvc文件上传支持批量上传,拖拽以及预览,文件内容校验等

    使用bootstrap-fileinput 使用方式: 1.nuget:Install-Package bootstrap-fileinput 2.语言本地化{下载fileinput_locale_z ...

随机推荐

  1. Windows7 x64 跨平台开发环境安装配置

    ======================================================================= Windows7 x64 跨平台开发环境安装配置 201 ...

  2. 摆脱命令行,Ubuntu下配置Android开发环境

    作者:宋志辉 微博:weibo.com/askzhihui/ 安装所需工具 一.新立得 新立得(Synaptic)是Debian和Ubuntu Linux操作系统的包管理工具apt的图形化前端. 它结 ...

  3. JSP编译成Servlet(一)语法树的生成——语法解析

    一般来说,语句按一定规则进行推导后会形成一个语法树,这种树状结构有利于对语句结构层次的描述.同样Jasper对JSP语法解析后也会生成一棵树,这棵树各个节点包含了不同的信息,但对于JSP来说解析后的语 ...

  4. Shell入门之概念

    1.一切皆是文件: 在bash Shell 中一切皆是文件,不管是我们认为的文本文件,还是那些文件夹的东西,在这里都是文件,Linux只管比特和字节流,而不关心他们最终组成了什么格式,这些工作交给在L ...

  5. FT5X06 如何应用在10寸电容屏(linux-3.5电容屏驱动简析&移植10寸电容屏驱动到Android4.2) (by liukun321咕唧咕唧)

    这是几个月以前的东西了,在彻底遗忘之前拿出来好好写写.做个笔记,也算是造福后来人了.在做这个项目之前,没有做过电容屏的驱动,印象中的电容触摸屏是不需要校正的.IC支持多大的屏就要配多大的屏.但是拿到需 ...

  6. 深入理解Android IPC机制之Binder机制

    Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe).信号(Sign ...

  7. Android View底层到底是怎么绘制的

    Android绘制链图: 网上很多讲Android  view的绘制流程往往只讲到了Measure - Layout - Draw. 但是,这只是一个大体的流程,而我们需要探讨的是Android在我们 ...

  8. PSAM 卡的应用 操作方法

    PSAM 卡的应用        PSAM 功能 终端安全存储模块        PASM  常用于 脱机交易的 安全认证        脱机交易的流程          1.卡片对持卡人的认证(防止 ...

  9. Android中代码运行指定的Apk

    有时候,当我们编写自己的应用的时候,需要通过代码实现指定的apk,安装指定的主题,或者安装新的apk.可以通过以下方法实现: private void installAPK(String apkUrl ...

  10. SVM实验

    说明: 1)α2=0表示第二个样例不在分类面上,在分类面上的点αi均不为零. 2)二次项矩阵,可以通过矩阵相乘相加方法得到,如上例 3)目标函数变为负值,是为了照顾matlab的标准型. 假定应用多项 ...