`

httpclient组件使用经验

阅读更多
httpclient组件使用经验

---------------------
文件上传:
---------------------
1.httpclient也可以使用putmethod方法
2.通过 putmethod.addRequestHeader(key,vaule)设置请求头部。也可设置一自定义的值,供服务端读出。
3.要实现文件上传不出现乱码问题,有以下几个注意点:
   1)http协议的乱码部分分为URI部分、Header部分以及Body部分。
   2)首先服务端的容器需要设置URI编码,如:tomcat配置文件中,对相关的访问端口设置URIEncoding="UTF-8"。
   3)在服务端的web.xml中,设置fileter对编码进行过滤转码
   4)对于uri中或是header中的中文在传间编码,服务端接收时解码。java.net.URLDecoder/URLEncoder.

4.文件上传的各种方式方法:
    1)客户端可以通过将文件流直接塞进请求体RequestEntity,如:put.setRequestEntity(InputStreamRequestEntity  entity),
      服务端通过request.getInputStream()获取。
InputStream in = request.getInputStream(); // 文件流获取
OutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[8196];
int n;
while((n = in.read(buffer, 0, buffer.length)) != -1) {
     out.write(buffer, 0, n);
}
out.close();

    2)客户端可以通过Part与MultipartRequestEntit方式,将上传内容塞进请求体。
       服务端通过request.getInputStream()方式-----这种有可能上传文件不能看。

客户端塞内容:     
File targetFile = new File("1.mp3");
Part[] parts = { new FilePart(targetFile.getName(), targetFile) };
    filePost.setRequestEntity(new MultipartRequestEntity(parts,filePost.getParams()));
    HttpClient client = new HttpClient();
    client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
    int status = client.executeMethod(filePost);
服务端取内容:
// Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // Set factory constraints
    factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb
    factory.setRepository(tempPathFile);// 设置缓冲区目录
    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    // Set overall request size constraint
    upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB
    List<FileItem> items = upload.parseRequest(request);// 得到所有的文件
    Iterator<FileItem> i = items.iterator();
    while (i.hasNext())
    {
     FileItem fi = (FileItem) i.next();
     String fileName = fi.getName();
     if (fileName != null)
     {
      File fullFile = new File(fi.getName());
      File savedFile = new File(uploadPath, fullFile.getName());
      fi.write(savedFile);
     }

    3)还有其它方式,如直接使用MultipartPostMethod方法上传。还没有深入研究。


4.文件流读取使用OutputStream写入时需要注意:
   OutputStream有几种write方法,尽量采用write(byte[] b, int off, int len)方法。
write(byte[] b) : 使用些方法写入,容易使文件比原文件增大0~你指定的len大小。从而使你的文件可以无法正常显示。尤其在最后一片的读写时易增大。
write(byte[] b, int off, int len):每次跟据读入情况,确定每次写入大小,不易出现异常。
write(int b) :



OutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[8196];
int n;
while((n = in.read(buffer, 0, buffer.length)) != -1) {
     System.out.println("------n--------" +n);
     System.out.println("------buffer--------" +buffer.length);
     out.write(buffer, 0, n);
}
out.close();

如上文中所错的测试结果:
------buffer--------8196
------n--------7983
.......
------buffer--------8196
------n--------7983
------buffer--------8196
------n--------3114
------buffer--------8196
说明:每次buffer的读取都未读满,不知是何原因。将指定的buffer大小改成2048再试:


--------------------------
遗留问题:
1.tomcat 中设置编码的作用?
2.web.xml中的filter的具体作用?
3.各种塞文件内容与取的方式,是否可以混 用?如果不能混用,他们的差异在哪,如何明确配对?  上面的方法是试过可行的,暂这么用。需要进一步了解深入。
4.在使用httpclient上传时,出现第次读的buffer示能读满,不知是何原因?
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics