欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

httpclient组件使用经验 博客分类: java常用知识 TomcatWebXML.net 

程序员文章站 2024-03-18 09:42:10
...
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示能读满,不知是何原因?



----------------------
文件头的设置: