public void fileupload(String para1,String para2,String filename,String path){
HttpClient client = new DefaultHttpClient();
//超时设置-30s
client.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,30000);
client.getParams().setIntParameter(HttpConnectionParams.CONNECTION_TIMEOUT, 30000);
//接口地址
HttpPost method = new HttpPost(url);
// method.setHeader("Content-Type", "multipart/form-data");
int status = 0;
try{
//设置参数
MultipartEntity entity = new MultipartEntity();
//第一个参数
entity.addPart("para1", new StringBody(cdn_id));
//第二个参数
entity.addPart("para2", new StringBody(filename));
//上传内容
<span style="color:#ff0000;">FileBody fb = new FileBody(new File(path),"text/plain");</span>
entity.addPart(filename, fb);
method.setEntity(entity);
//执行上传
HttpResponse httpresponse = client.execute(method);
status = httpresponse.getStatusLine().getStatusCode(); //根据返回状态200等判断提交是否成功
if (status == HttpStatus.SC_OK) {
// --------------------接收返回值---------------------------
HttpEntity entitysendback = httpresponse.getEntity();
if (entitysendback != null) {
InputStream input = entitysendback.getContent();
BufferedReader br = new BufferedReader(
new InputStreamReader(input));
String tempbf;
StringBuffer html = new StringBuffer();
while ((tempbf = br.readLine()) != null) {
html.append(tempbf);
}
input.close();
br.close();
String result = html.toString();// 返回的json
JSONObject jsonobject = null;
int sts = 1;
try { //正确返回json,错误返回String
jsonobject = JSONObject.fromObject(result);
sts = Integer.parseInt(jsonobject.getString("status"));
} catch (Exception e) {
System.out.println("出错!原因为:" + result);
sts = 2;
}
// 若提交成功:
if (sts == 0) {
addAndDelete(path);
} else if (sts == 1) {
System.out.println(jsonobject.getString("error"));
}
}
// 关闭应该关的资源
EntityUtils.consume(entitysendback);
//-----------------------接收返回值结束-----------------------------------
}else{
System.out.println(status+"其他未知输入,请联系管理员");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
client.getConnectionManager().shutdown();
}
}
而模拟接收的servlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request,response);
}
private void process(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
System.out.println("通======================================");
try
{
System.out.println(request.getParameter("cdn_id"));
String filename = request.getParameter("filename");
System.out.println(filename);
// 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();
boolean flag = "text/plain".equals(fi.getContentType());
System.out.println("type="+fi.getContentType());
System.out.println("是否为txt格式的:"+flag);
String fileName = fi.getName();
if (fileName != null)
{
File fullFile = new File(fi.getName());
File savedFile = new File(uploadPath, fullFile.getName());
fi.write(savedFile);
}
}
System.out.print("upload succeed");
}
catch (Exception e)
{
System.out.println(e.getMessage());
// 可以跳转出错页面
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request,response);
}
最近项目要求用http上传文件和参数,然后使用httpclient3.1.2开始写。
官网例子发现最新的httpclient4的方法中都是单独提交附件的例子,我这还有参数。
于是思考setHeader的事情,忽然想起来,setHeader是整体的,而我只要附件是text/plain格式的,所以只要局部的格式是text/plain格式的就可以了。在变换3.x和4.x的过程中发现httppost.setEntity(entity);多次取setEntity取最后一个entity。
参考资料:
MIME头:http://www.cnblogs.com/lobtao/articles/2954326.html
最终方法发现:http://codego.net/186270/
Multipart/form-data POST文件上传详解:http://www.j2men.com/index.php/archives/955
httpclient4 post上传:http://blog.csdn.net/sunny243788557/article/details/8106265
response.setContentType()的作用及MIME参数详解:http://www.jb51.net/article/32773.htm
这里依然回归最开始使用的httpclient3: