序
需求:实现上传图片到远程文件服务器,为了负载均衡,资源同步,数据安全,所以说干就干……
1、过程
各种问度娘,看博客,逛论坛……HttpClient 、HttpURLConnection、FTP、SFTP...好吧各种网络传输协议都试过一遍,发现自己还是回到原点……
自己智障的原因,懒……只想着把网上的代码复制下来,直接用,却没有好好的分析……
2、迷茫
忙活了一个星期,老师一直催,但一直没什么进展,一直想有个老司机带我飞多好,不过越这样想,越对自己都没信心了,痛定思痛……
3、希望
好吧,不能指望老司机了,还是得靠自己。使用谷歌,上github,认真查阅文档……
慢慢的自己有了头绪,正如《美队3》里面的反派所说,"只要有经验和耐心,任何事都可以做到……"
最后选择Http协议的理由:HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。
虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
4、代码
本地服务器192:CkeditorUploadAction
PostMethod filePost = new PostMethod(URL_STR);
HttpClient client = new HttpClient();
String dirName = getUserInfo().getUsername();
try {
// 通过以下方法可以模拟页面参数提交
Part[] parts = { new FilePart(dirName+'-'+trueName, toFile) };
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
if (status == HttpStatus.SC_OK) {
System.out.println("上传成功");
} else {
System.out.println("上传失败");
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
filePost.releaseConnection();
}
远程服务器192:UploadFileServlet
package com.servlet;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UploadFileServlet
*/
@WebServlet("/UploadFileServlet")
public class UploadFileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public UploadFileServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
try {
processUpload(request,response);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
// String uploadPath= "C:\\test\\";
private static String uploadPath = "C:\\apache-tomcat-8.0.28-windows-x64\\webapps\\uploads\\";
public void processUpload(HttpServletRequest request, HttpServletResponse response) throws FileUploadException{
File uploadFile = new File(uploadPath);
if (!uploadFile.exists()) {
uploadFile.mkdirs();
}
System.out.println("Come on, baby .......");
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
response.setCharacterEncoding("utf-8");
//检测是不是存在上传文件
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart){
DiskFileItemFactory factory = new DiskFileItemFactory();
//指定在内存中缓存数据大小,单位为byte,这里设为1Mb
factory.setSizeThreshold(1024*1024);
//设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
factory.setRepository(new File("C:\\temp"));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// 指定单个上传文件的最大尺寸,单位:字节,这里设为50Mb
upload.setFileSizeMax(50 * 1024 * 1024);
//指定一次上传多个文件的总尺寸,单位:字节,这里设为50Mb
upload.setSizeMax(50 * 1024 * 1024);
upload.setHeaderEncoding("UTF-8");
List<FileItem> items = upload.parseRequest(request);
if(items!=null){
//解析表单项目
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
System.out.println("item...."+item);
System.out.println("item.getFileName()..."+item.getFieldName());
//如果是普通表单属性
if (item.isFormField()) {
//相当于input的name属性 <input type="text" name="content">
String name = item.getFieldName();
//input的value属性
String value = item.getString();
System.out.println("属性:" + name + " 属性值:" + value);
}
//如果是上传文件
else {
//属性名
String fieldName = item.getFieldName();
String[] strarray=fieldName.split("-");
String newUploadPath =uploadPath+strarray[0];
File dirName = new File(newUploadPath);
if (!dirName.exists()) {
dirName.mkdirs();
}
//上传文件路径
String fileName = item.getName();
fileName = fileName.substring(fileName.lastIndexOf("/") + 1);// 获得上传文件的文件名
try {
item.write(new File(newUploadPath, strarray[1]));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
response.addHeader("token", "hello");
}
}
ps:网上很多都没有服务端的代码,太坑了,服务端注意需要两个jar文件,commons-fileupload-1.3.1.jar 以及 commons-io-2.5.jar
最后所需的jar,打包下载:链接:http://download.csdn.net/detail/sage_wang/9515110