android上实现multi-part上传

本文记录了在Android中使用HttpClient进行Multipart图片上传时遇到的进度问题。由于上传图片为InputStream而非File,导致无法准确显示进度。通过研究android-async-http库源码及Fiddler抓包,发现chunk编码的chunk size并非问题所在。最终发现是Socket的send buffer大小导致数据一次性读取,引发超时错误。通过反射调整SocketImpl的send buffer大小解决了问题。
摘要由CSDN通过智能技术生成

最近做http的图片上传,约定好用http的multipart实现。遇到的一些坑,网上查不到不到解决方案,自己解决了,在这儿记录下来。

android自带的http实现有两种,一个是java的HttpUrlConnection,一个是apache的HttpClient,在项目里用的是后者,因为感觉它的封装程度使用起来更方便些。

之前使用的是一个国人写的基于HttpClient的框架,用着各种坑。最近接入七牛的sdk时发现人家用的是android-async-http,于是去github找到了这个,看起来挺不错的,决定换之。幸好之前觉得国人那个框架不靠谱,自己封装了个中间层,换库代价没那么大。

大坑仍然是multi-part上传图片,因为上传前有时需要压缩图片,所以传的参数是InputStream而不是File。虽然也可以把InputStream转为File或bytes,但感觉那样太蛋疼了,还是想直接传,于是问题来了。

发现,这个库上传图片的InputStream时,进度马上走到100%,像是被直接读进缓存了。这个当然不行,进度条完全就一摆设,上网查到了说法:

https://github.com/loopj/android-async-http/issues/118

原来是这个库的缺陷,有个家伙把文件上传进度失效的问题搞了,但是InputStream的没搞,虽然自己搞完后感觉人家那种搞法并没什么卵用。求人不如求己,决定自己改下这个库。

multipart的实现主要在SimpleMultipartEntity里面,isChunked()直接返回的false,十分怀疑这个能否实现文件的上传进度。学人家解决文件上传的方式处理了一下InputStream,结果进度还是直接到100%,所以这种方法并没用。七牛能实现进度,是因为他们自己把文件分成了多块,用多个请求分别上传,对于我并不适用。

RequestParams:
public HttpEntity getEntity(ResponseHandlerInterface progressHandler) throws IOException {
        if (useJsonStreamer) {
            return createJsonStreamerEntity(progressHandler);
        } else if (!forceMultipartEntity && streamParams.isEmpty() && fileParams.isEmpty() && fileArrayParams.isEmpty()) {
            return createFor
在Spring MVC中配置Multi-part解析器需要以下几个步骤: 1. 添加Maven依赖 ```xml <!-- Spring MVC Multi-part Dependency --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> ``` 2. 配置Multi-part解析器 在Spring配置文件中添加如下配置: ```xml <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="1000000" /> </bean> ``` 在这个示例中,我们使用了CommonsMultipartResolver作为Multi-part解析器,并设置了最大上传文件大小为1MB。 3. 在控制器中使用Multi-part解析器 你可以在控制器中通过@RequestParam注解获取上传的文件,例如: ```java @RequestMapping(value = "/uploadFile", method = RequestMethod.POST) public String uploadFile(@RequestParam("file") MultipartFile file) { // 处理上传的文件 return "redirect:/"; } ``` 在这个示例代码中,我们使用@RequestParam注解将上传的文件绑定到MultipartFile对象上。你可以在控制器中使用MultipartFile对象处理上传的文件。 注意,如果你使用的是Spring Boot,Multi-part解析器已经默认配置好了,你只需要在控制器中使用即可。例如: ```java @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { // 处理上传的文件 return "redirect:/"; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值