客户端图片上传到服务器

需求: 在手机客户端调用服务器端接口 把手机中的图片上传到 接口提供的服务器上。

例如 新浪微博中的 发表附带图片的微博。 


注:这里最好不要用socker编程来实现,因为当图片过大的时候,图片被解析成二进制(或者字节       数组)通过socker流传过来的时候比较慢,当网络慢的时候往往会因为超时抛异常导致不能调用接口   成功。      


其实可以在客户端模拟表单提交一样,把图片附件上传到接口提供的服务器上。

 新浪和腾讯的微博都是这样实现的,具体可以参考: 

新浪微博接口:    http://open.weibo.com/wiki/Statuses/upload      

腾讯微博接口:  http://wiki.open.t.qq.com/index.php/API%E6%96%87%E6%A1%A3/%E5%BE%AE%E5%8D%9A%E6%8E%A5%E5%8F%A3/%E5%8F%91%E8%A1%A8%E4%B8%80%E6%9D%A1%E5%B8%A6%E5%9B%BE%E7%89%87%E7%9A%84%E5%BE%AE%E5%8D%9A  



我的实现代码如下(测试通过):


客户端调用代码:

01 package com.common.myTest;
02  
03 import java.io.File;
04 import org.apache.commons.httpclient.HttpClient;
05 import org.apache.commons.httpclient.HttpStatus;
06 import org.apache.commons.httpclient.methods.PostMethod;
07 import org.apache.commons.httpclient.methods.multipart.FilePart;
08 import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
09 import org.apache.commons.httpclient.methods.multipart.Part;
10 public class Hclient {
11  public static void main(String args[]) {
12   String targetURL = null//-- 指定URL
13   File targetFile = null//-- 指定上传文件
14   targetFile = new File("D:\\image1\\超大图片.jpg");
15   targetURL = "http://localhost:8080/servlet/HServlets"; // servleturl
16   PostMethod filePost = new PostMethod(targetURL);
17   try {
18    // 通过以下方法可以模拟页面参数提交
19    Part[] parts = { new FilePart(targetFile.getName(), targetFile) };
20    filePost.setRequestEntity(new MultipartRequestEntity(parts,
21      filePost.getParams()));
22    HttpClient client = new HttpClient();
23    client.getHttpConnectionManager().getParams().setConnectionTimeout(
24      5000);
25    int status = client.executeMethod(filePost);
26    if (status == HttpStatus.SC_OK) {
27     System.out.println("上传成功");
28     // 上传成功
29    else {
30     System.out.println("上传失败");
31     // 上传失败
32    }
33   catch (Exception ex) {
34    ex.printStackTrace();
35   finally {
36    filePost.releaseConnection();
37   }
38  }
39 }


服务器端代码:
01 package com.common.myTest;
02  
03 import java.io.File;
04 import java.io.IOException;
05 import java.util.Iterator;
06 import java.util.List;
07  
08 import javax.servlet.ServletConfig;
09 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13  
14 import org.apache.commons.fileupload.FileItem;
15 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
16 import org.apache.commons.fileupload.servlet.ServletFileUpload;
17 import org.apache.commons.logging.Log;
18 import org.apache.commons.logging.LogFactory;
19  
20 public class HServlets extends HttpServlet {
21     private Log log = LogFactory.getLog(HServlets.class);
22  private static final long serialVersionUID = 1L;
23  private String uploadPath; // 上传文件的目录
24  private String tempPath; // 临时文件目录
25  File tempPathFile;
26  
27  public void init(ServletConfig config) throws ServletException {
28   super.init(config);
29   uploadPath = config.getServletContext().getInitParameter("imageStorePath");
30   tempPath = config.getServletContext().getInitParameter("images_120");
31    
32   File uploadFile = new File(uploadPath);
33   if (!uploadFile.exists()) {
34    uploadFile.mkdirs();
35   }
36   File tempPathFile = new File(tempPath);
37   if (!tempPathFile.exists()) {
38    tempPathFile.mkdirs();
39   }
40  }
41  
42  @SuppressWarnings("unchecked")
43  public void doPost(HttpServletRequest request, HttpServletResponse response)
44    throws ServletException, IOException {
45   try {
46       log.info("进入上传图片的servlt");
47  
48    DiskFileItemFactory factory = new DiskFileItemFactory();
49    factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb
50    factory.setRepository(tempPathFile);// 设置缓冲区目录
51  
52    ServletFileUpload upload = new ServletFileUpload(factory);
53    upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB
54    List<FileItem> items = upload.parseRequest(request);// 得到所有的文件
55    Iterator<FileItem> i = items.iterator();
56    while (i.hasNext()) {
57     FileItem fi = (FileItem) i.next();
58     String fileName = fi.getName();
59     log.info("上传图片的名字:"+fileName);
60     if (fileName != null) {
61      File fullFile = new File(fi.getName());
62      File savedFile = new File(uploadPath, fullFile.getName());
63      fi.write(savedFile);
64     }
65    }
66    log.info("上传成功!");
67   catch (Exception e) {
68    log.info(e.getMessage());
69    // 可以跳转出错页面
70    e.printStackTrace();
71   }
72  }
73  
74  
75 }


http://my.oschina.net/u/1172409/blog/153589

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值