您的位置:首页 > 理论基础 > 计算机网络

利用HttpClient模拟form表单将文件上传到Servlet

2013-12-06 15:14 531 查看
今天项目中需要利用C语言将日志文件通过http方式上传到java-web中,为了自测,所以找到了一个HttpClient类,不过也可以用URLConnection来模拟;现在把代码贴出来,以备所需;

客户端代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package upload;

import java.io.File;
import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.MultipartPostMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;

public class HttpClientUtile {

public String uploadFiles(String strUrl, String[] strFiles)
{
String strResponse = null;
HttpClient httpClient = new HttpClient();
MultipartPostMethod multipartPostMethod = new MultipartPostMethod(strUrl);
try {

for (int i = 0; i < strFiles.length; i++) {
multipartPostMethod.addPart(new FilePart("file"+i,new File(strFiles[i])));
}
int statusCode = httpClient.executeMethod(multipartPostMethod);
if (statusCode == 200) {
strResponse = multipartPostMethod.getResponseBodyAsString();
}
} catch (Exception e){
e.printStackTrace();
}
finally
{
multipartPostMethod.releaseConnection();
}
return strResponse;
}
public String uploadFiles(String strUrl,String strFrom, String strFiles)
{
String strResponse = null;
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(strUrl);
try {
FilePart filePart = new FilePart("file","aa.txt",new File(strFiles));
MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(new Part[]{new StringPart("HIDDEN","from",strFrom),filePart},postMethod.getParams());

postMethod.addParameter(new NameValuePair("from",strFrom));

postMethod.setRequestEntity(multipartRequestEntity);

httpClient.getParams().setContentCharset("UTF-8");
int statusCode = httpClient.executeMethod(postMethod);
if (statusCode == 200) {
strResponse = postMethod.getResponseBodyAsString();
}
} catch (Exception e){
e.printStackTrace();
}
finally
{
postMethod.releaseConnection();
}
return strResponse;
}
/**
* @category 上传附件
* @param strUrl
* @param strFiles
* @return 返回状态码 200 正常
* @throws Exception
*/
public String uploadFiles(String strUrl,String attachments) throws Exception
{
String strResponse = null;
HttpClient httpClient = new HttpClient();
MultipartPostMethod postMethod = new MultipartPostMethod(strUrl.trim());
try {
if (null != attachments && attachments.trim().length()>0) {
String [] strArr = attachments.trim().split("\\|");
for (int i = 0; i < strArr.length; i++) {
if (null!= strArr[i] && strArr[i].trim().length()>0) {
String fileName = strArr[i].trim();
fileName = fileName.replaceAll("\\\\", "/").replaceAll("//","/");
fileName = fileName.replaceAll("\\\\", "/").replaceAll("//","/");
String[] strTmpNameArr = fileName.split("/");
if (strTmpNameArr.length>0) {
fileName = strTmpNameArr[strTmpNameArr.length-1];
postMethod.addPart(new FilePart(fileName,new File(strArr[i].trim())));
}
}
}
}
else {
return "File can not be null";
}
httpClient.getParams().setContentCharset("UTF-8");
int statusCode = httpClient.executeMethod(postMethod);
if (statusCode == 200) {
strResponse = postMethod.getResponseBodyAsString();

}
return strResponse;
} catch (Exception e){
throw e;
}
finally
{
postMethod.releaseConnection();
}
}

public static void main(String[] args) {
HttpClientUtile testSendData = new HttpClientUtile();
try {
String strUploadFile = testSendData.uploadFiles("http://172.16.22.61:8068/isite/uploadLog", "d://project.txt");
System.out.println("strUploadFile:"+strUploadFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}


用到的Jar包:commons-httpclient-3.0.1.jar、commons-logging-1.1.1.jar、commons-beanutils-1.8.0-BETA.jar和commons-codec.jar;这个网上很多,很容易就可以找到;

服务端接收的代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.ithings.irtu.sync.controller;

import com.ithings.irtu.utils.SystemConstants;
import com.ithings.util.CommUtils;
import java.io.File;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;

/**
*
*/
public class UploadLogServlet extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
doPost(req, resp);
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
PrintWriter out = null;
String flag = "0";
File saveFile = null;
try {
out = resp.getWriter();
String fileName = req.getParameter("name");
if(CommUtils.isNull(fileName)){
fileName = "upgrade"  + CommUtils.convertDateToString(new Date(), "yyyy-MM-dd-HH-mm-ss")  + ".txt";
}
String filePath = SystemConstants.UPGRADE_LOG_FILE_PATH +  fileName;
File dir = new File(SystemConstants.UPGRADE_LOG_FILE_PATH);
if(!dir.exists()){
dir.mkdirs();
}
DiskFileUpload diskFileUpload = new DiskFileUpload();
///设置可上传文件的最大尺寸
diskFileUpload.setSizeMax(20*1024*1024);
//设置缓冲区大小,这里是2kb
diskFileUpload.setSizeThreshold(2048);
//设置临时目录
diskFileUpload.setRepositoryPath(SystemConstants.UPGRADE_LOG_FILE_PATH);
//获取所有文件
List listFiles = diskFileUpload.parseRequest(req);
if (null != listFiles && listFiles.size() > 0) {
for (int i = 0; i < listFiles.size(); i++) {
FileItem fileItem = (FileItem)listFiles.get(i);
if (null != fileItem.getName()) {
saveFile = new File(SystemConstants.UPGRADE_LOG_FILE_PATH,fileItem.getName());
fileItem.write(saveFile);
}else{
saveFile = new File(filePath);
fileItem.write(saveFile);
}
}
}
if(saveFile != null && saveFile.length() == 0){
flag = "1";
saveFile.delete();
}
} catch (Exception e) {
Logger.getLogger(UploadLogServlet.class.getName()).log(Level.SEVERE, null, e);
flag = "1";
}finally{
if(out != null){
out.write(flag);
out.flush();
out.close();
}
}
}

}


其中SystemConstants.UPGRADE_LOG_FILE_PATH表示文件存放目录,你们可以定义自己的位置;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: