作者yauhh (哟)
看板AndroidDev
标题Re: [问题] HTTP (HttpClient) 上传大档案
时间Fri Apr 6 15:19:27 2012
※ 引述《yauhh (哟)》之铭言:
: 嗨各位,最近处理档案上传遇到了问题不知道怎麽解决.
: 我采用的上传方案是用HttpClient,不是HttpURLConnection.
: 用Apache HTTP方案中的HttpClient搭配MultiPartEntity,
: 可以做出彷佛一个网页表单那样,放一个档案栏位,後面跟着一些注解文字,
: 这样子上传. 但是这样子发现,手机中小的档案很容易上传,
: 但是大的档案传不上去. (而程式没有Exception,而且200 OK.)
: 查了一些资料,知道好像有InputStreamEntity可以.setChunked(true)
: 变成分块方式传输. 但是该怎麽整合MultiPartEntity和InputStreamEntity呢?
: 我原本的程式是
: HttpPost hpo = new HttpPost(url);
: MultiPartEntity mupent = new MultiPartEntity();
: mupent.addPart(...
: ...
: hpo.setEntity(mupent);
: HttpPost的entity是否只能塞一个? 能不能在MultiPartEntity中放一些InputStream-
: Entity,使得.isChunked为true? 或者,如何直接调整MultiPartEntity为chunked?
我给自己的问题找到答案:
MultipartEntity中可以放StringBody, FileBody,也可以放InputStreamBody.
放了FileBody时,我发现
entity.isChunked() 为false
entity.isRepeatable() 为true (可以反覆读取档案内容)
entity.isStreaming() 为false
而放了InputStreamBody,则是
entity.isChunked() 为true
entity.isRepeatable() 为false
entity.isStreaming() 为true
而 httpClient.execute(httpPost) 得到200 OK却没有看到上传档案,
其实是自己耍乌龙没有发现server有档案格式检查.
但是讲起档案格式检查,也有个怪怪的地方:
本来我用JPEG规格定义的magic number (档案开头二位元为0xFF 0xD8,
档案最後二位元为0xFF 0xD9) 来判断档案其实是不是JPEG档,
但是自己手机的照片 /sdcard/DCIM/Camera/*.jpg,上传之後发现
档案最後二位元不符合规定的magic number.
这就不知道手机的相机是怎麽处理JPEG了.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 180.205.0.23
※ 编辑: yauhh 来自: 61.231.70.252 (04/07 00:18)