一、JSP + Servlet 实现简单的文件上传:
1、使用的jar包:commmons-fileupload.jar
2、Jsp页面:enctype="multipart/form-data"
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script type="text/javascript">
function validator(){
var file = document.getElementById("file").value;
if(file == null || file == ""){
alert('请选择需要上传的文件');
return false;
}
return true;
}
</script>
</head>
<body>
<form method="post" name="upload" enctype="multipart/form-data" action="upload" οnsubmit="return validator();">
<input id="file" name="file" type="file" value="请选择上传文件"/>
<input type="submit" value="上传" />
</form>
</body>
</html>
2、Servlet实现:
public class Upload extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) {
String tempDirectory = "d:\\temp\\"; // 临时文件夹:上传成功之前存放缓存的位置
String fileDirectory = "d:\\uploadFiles\\"; // 文件存放目录
try {
// 将未完全上传成功的信息放到指定的临时文件夹
File repositoryFile = new File(tempDirectory);
int sizeThreshold = 1024 * 64; // 写满该大小的缓存后,存入硬盘中。
FileItemFactory factory = new DiskFileItemFactory(sizeThreshold,
repositoryFile);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(500*1024*1024); //set every upload file size <500Mb
List items = upload.parseRequest(request); // 这里开始执行上传
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
File uploadedFile = new File(fileDirectory + item.getName());
item.write(uploadedFile);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、web.xml配置:
<servlet> <servlet-name>fileUpload</servlet-name> <servlet-class>test.Upload</servlet-class> </servlet> <servlet-mapping> <servlet-name>fileUpload</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping>
==================================================================================================
二、JSP + Struts1实现文件上传:
1、Form表单:
public class UploadFileForm extends ActionForm{
FormFile uploadFile;
public FormFile getUploadFile() {
return uploadFile;
}
public void setFormFile(FormFile uploadFile) {
this.uploadFile = uploadFile;
}
}
2、 Action:
public class UploadAction extends Action{
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
UploadFileForm uploadFileForm = (UploadFileForm) form;
FormFile file = uploadFileForm.getUploadFile();
String fileName = file.getFileName();
InputStream is = file.getInputStream();
OutputStream os = new FileOutputStream("D:\\" + fileName);
while (is.read() != -1) {
os.write(is.read());
}
return super.execute(mapping, form, request, response);
}
}
3、Jsp:file的name属性与Form表单中FormFile名称对应。
4、web.xml:ActionServelet的配置
5、struts-config.xml:action配置
==================================================================================================
三、JSP + Struts2实现文件上传
Action实现:
public class UploadAction extends ActionSupport {
private File upload;
private String uploadFileName;
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String upload() throws IOException {
InputStream is = new FileInputStream(upload);
OutputStream os = new FileOutputStream("D:\\" + uploadFileName);
while (is.read() != -1) {
os.write(is.read());
}
}
}
关于文件上传中文乱码的问题:Struts从request里利用BeanUtils.populate()把值赋给form的时候已经是乱码的,所以赋值之前要进行编码的转换。可以通过写过滤器进行编码的设置。