1. 文件上传有2种方式:
一种方式以流的形式提交,到服务器后自己解析http协议获取上传内容。
二种方式使用第三方提供的插件来完成文件上传:smartfileupload,commons-fileupload.
2.使用 commons- fileupload实现文件上传的步骤:
a) 导入commons-fileupload,和 commons-io两个包。
b) 编写jsp页面,页面表单必须是post提交方式,必须enctype设置为:multiparty/form-data.
<form action="upload" enctype="multipart/form-data" method="post"> 用户名:<input type="text" name="username"/><br> 文件:<input type="file" name="file"/><input type="submit" value="上传"/> </form>
c) 编写Servlet:
@WebServlet("/upload") public class UploadServlet extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建磁盘工厂对象 DiskFileItemFactory factory = new DiskFileItemFactory(); //设置缓存区大小 factory.setSizeThreshold(1024*1024); //设置文件上传的临时目录 factory.setRepository(new File("c:/")); //创建文件上传处理器 ServletFileUpload handler = new ServletFileUpload(factory); try { //将文件上传表单 解析为FileItem,一个FileItem是一个表单项 List<FileItem> list = handler.parseRequest(req); for(FileItem item:list){ if(item.isFormField()){//普通表单项 //item.getFieldName()获取表单项的名称 //iem.getString() 获取表单项的值 System.out.println(item.getFieldName()+"-----"+item.getString()); }else{//文件上传项 //item.getName()获取文件名---不同浏览器可能不一样 //item.getString() 获取文件内容 String path=req.getRealPath("/upload"); //将文件内容写入指定位置 item.write(new File(path,item.getName())); } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
4. 在struts2中,已经将文件上传功能继成到了fileload拦截器中,该拦截器默认被引用,所以可以直接开发文件上传功能。默认情况下上传的文件最大为2m,如果大于默认需要重新设置。
实现步骤如下:
a) 编写jsp:
<form action="upload.action" enctype="multipart/form-data" method="post"> 文件:<input type="file" name="file"/><input type="submit" value="上传"/> </form>
b)编写action:
public class UploadAction { //file文件 的名称和表单域名相同 private File file; //文件名 是由 表单域名+FileName组成 private String fileFileName; //文件类型 是由 表单域名+ContentType组成 private String fileContentType; //上传处理 public String upload() throws IOException{ HttpServletRequest req = ServletActionContext.getRequest(); String path = req.getRealPath("/upload"); //自己可以通过io流来实现 FileUtils.copyFile(file, new File(path,fileFileName)); return Action.SUCCESS; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileFileName() { return fileFileName; } public void setFileFileName(String fileFileName) { this.fileFileName = fileFileName; } public String getFileContentType() { return fileContentType; } public void setFileContentType(String fileContentType) { this.fileContentType = fileContentType; } }
c)配置:
<struts> <!-- 设置总文件大小 struts.multipart.maxSize>=maximumSize --> <constant name="struts.multipart.maxSize" value="209715200"></constant> <package name="default" namespace="/" extends="struts-default"> <action name="upload" class="cn.sxt.action.UploadAction" method="upload"> <interceptor-ref name="fileUpload"> <!-- 设置上传文件的大小 单个文件大小 --> <param name="maximumSize">209715200</param> </interceptor-ref> <interceptor-ref name="basicStack"></interceptor-ref> <result>/index.jsp</result> </action> </package> </struts>
5. 批量的文件上传:
public class BatchUploadAction {
//file文件 的名称和表单域名相同
private File file[];
//文件名 是由 表单域名+FileName组成
private String fileFileName[];
//文件类型 是由 表单域名+ContentType组成
private String fileContentType[];
//上传处理
public String upload() throws IOException{
HttpServletRequest req = ServletActionContext.getRequest();
String path = req.getRealPath("/upload");
for(int i=0;i<file.length;i++)
FileUtils.copyFile(file[i], new File(path,fileFileName[i]));
return Action.SUCCESS;
}
public File[] getFile() {
return file;
}
public void setFile(File[] file) {
this.file = file;
}
public String[] getFileFileName() {
return fileFileName;
}
public void setFileFileName(String[] fileFileName) {
this.fileFileName = fileFileName;
}
public String[] getFileContentType() {
return fileContentType;
}
public void setFileContentType(String[] fileContentType) {
this.fileContentType = fileContentType;
}
}