需求: 在手机客户端调用服务器端接口 把手机中的图片上传到 接口提供的服务器上。
例如 新浪微博中的 发表附带图片的微博。
注:这里最好不要用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; |
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 ; |
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); |
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( |
25 | int status = client.executeMethod(filePost); |
26 | if (status == HttpStatus.SC_OK) { |
27 | System.out.println( "上传成功" ); |
30 | System.out.println( "上传失败" ); |
33 | } catch (Exception ex) { |
36 | filePost.releaseConnection(); |
服务器端代码:
01 | package com.common.myTest; |
04 | import java.io.IOException; |
05 | import java.util.Iterator; |
06 | import java.util.List; |
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; |
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; |
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; |
27 | public void init(ServletConfig config) throws ServletException { |
29 | uploadPath = config.getServletContext().getInitParameter( "imageStorePath" ); |
30 | tempPath = config.getServletContext().getInitParameter( "images_120" ); |
32 | File uploadFile = new File(uploadPath); |
33 | if (!uploadFile.exists()) { |
36 | File tempPathFile = new File(tempPath); |
37 | if (!tempPathFile.exists()) { |
38 | tempPathFile.mkdirs(); |
42 | @SuppressWarnings ( "unchecked" ) |
43 | public void doPost(HttpServletRequest request, HttpServletResponse response) |
44 | throws ServletException, IOException { |
46 | log.info( "进入上传图片的servlt" ); |
48 | DiskFileItemFactory factory = new DiskFileItemFactory(); |
49 | factory.setSizeThreshold( 4096 ); |
50 | factory.setRepository(tempPathFile); |
52 | ServletFileUpload upload = new ServletFileUpload(factory); |
53 | upload.setSizeMax( 4194304 ); |
54 | List<FileItem> items = upload.parseRequest(request); |
55 | Iterator<FileItem> i = items.iterator(); |
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()); |
67 | } catch (Exception e) { |
68 | log.info(e.getMessage()); |
http://my.oschina.net/u/1172409/blog/153589