Apache的上传组件其它已经被封装到Struts那中去了,我在网上找到了一些文章介绍它是如何上传文件的,自己跟了一下源码也写了一个上传的实例,仅供参考!
一、JSP页面如下:
<form method="POST" action="UploadServlet"
ENCTYPE="multipart/form-data">
<table>
<tr><td><input type="text" name="subject" /></td></tr>
<tr><td><input type="text" name="subject" /></td></tr>
<tr><td><input type="file" name="file1" /></td></tr>
<tr><td><input type="file" name="file2" /></td></tr>
<tr><td><input type="file" name="file3" /></td></tr>
<tr><td><input type="submit" value="上传"/></td></tr>
</table>
</form>
<br />
<a href="DownLoadServlet">下载</a>
二、上传的Servlet如下:
/**
* Apache组件上传
*
* @author mingxue.zhang@163.com
* @date 2010-10-30
*/
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 5827821285414610443L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 上传文件目录
String uploadDir = this.getServletContext().getRealPath("/uploadDir");
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存区块大小4KB
factory.setSizeThreshold(4 * 1024);
// 设置暂存容器,当上传文件大于设置的内存块大小时,用暂存容器做中转
factory.setRepository(new File(this.getServletContext().getRealPath(
"/temp")));
ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setSizeMax(1024 * 1024 * 100);
fileUpload.setFileSizeMax(1024 * 1024 * 10);
List<FileItem> fileItemList = null;
try {
fileItemList = fileUpload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
Iterator<FileItem> fileItemIterator = fileItemList.iterator();
FileItem fileItem = null;
while (fileItemIterator.hasNext()) {
fileItem = fileItemIterator.next();
// 普通文件框上传
if (fileItem.isFormField()) {
String filedName = fileItem.getFieldName();
String filedValue = fileItem.getString("GBK");// 编码格式
System.out.println(filedName);// 文件框名称
System.out.println(filedValue);// 文件的值
} else {
String filedName = fileItem.getFieldName();// 文件上传框的名称
// 获取文件上传的文件名
String OriginalFileName = takeOutFileName(fileItem.getName());
System.out.println("原始文件名:"+OriginalFileName);
if (!"".equals(OriginalFileName)) {
// 根据上传的文件名重新命名
String newFileName = getNewFileName(OriginalFileName);
System.out.println("重新名:"+newFileName);
File writeToFile = new File(uploadDir + File.separator
+ newFileName);
try {
fileItem.write(writeToFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
private String takeOutFileName(String filePath) {
String fileName = filePath;
if (null != filePath && !"".equals(filePath)) {
int port = filePath.lastIndexOf("\\");
if(port != -1){
fileName = filePath.substring(port+1);
}
}
return fileName;
}
private String getNewFileName(String originalFileName) {
StringBuffer newFileName = new StringBuffer();
if (null != originalFileName && !"".equals(originalFileName)) {
int port = originalFileName.lastIndexOf(".");
String type = "";
String fileName = "";
if (port != -1) {
type = originalFileName.substring(port + 1);
fileName = originalFileName.substring(0, port);
} else {
fileName = originalFileName;
}
StringBuffer suffix = new StringBuffer("_");
suffix.append(Calendar.getInstance().getTimeInMillis());
suffix.append("_");
suffix.append(new Random().nextInt(100));
newFileName.append(fileName);
newFileName.append(suffix);
newFileName.append(".");
newFileName.append(type);
}
return newFileName.toString();
}
}
三、下载的Servlet如下:
/**
* Apache组件下载
*
* @author mingxue.zhang@163.com
* @date 2010-10-30
*/
public class DownLoadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filePath = "D:\\Tomcat\\apache-tomcat-6.0.26\\webapps\\ApacheUpload\\uploadDir\\";
String fileName = "2010年10月安排2_1288447490125_56.txt";
String Originalname = "2010年10月安排2.txt";
response.setContentType("application/octet-stream");
String isoFileName = new String(Originalname.getBytes("GB2312"),
"ISO8859-1");
response.setHeader("Content-Disposition", "attachment; filename="
+ isoFileName);
ServletOutputStream out = response.getOutputStream();
BufferedOutputStream bufferOut = new BufferedOutputStream(out);
FileInputStream inputStream = new FileInputStream(new File(filePath,
fileName));
BufferedInputStream bufferInput = new BufferedInputStream(inputStream);
byte[] buffer = new byte[5 * 1024];
int length = 0;
while ((length = bufferInput.read(buffer)) != -1) {
bufferOut.write(buffer, 0, length);
}
bufferInput.close();
inputStream.close();
bufferOut.close();
out.close();
}
}
Servlet配置如下:
<servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.mengya.servlet.UploadServlet</servlet-class> </servlet> <servlet> <servlet-name>DownLoadServlet</servlet-name> <servlet-class>com.mengya.servlet.DownLoadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>DownLoadServlet</servlet-name> <url-pattern>/DownLoadServlet</url-pattern> </servlet-mapping>