javaWeb上传与下载
上传:
上传方式:
jspSmartUpload :应用在jsp上的文件上传与下载组件。
FileUpload :用用在jaava环境上的上传的功能
Servlet3.0 :提供了文件上传功能
Struts2 :提供文件上传的功能
这里主要讲述FileUpload上传和下载
上传三要素:
1.提交的方式必须是post(因为get提交的内容大小是有限制的)
2.表单中需要有<input type=”file”>元素,需要有name属性和值。
3.表单enctype=”multipart/form-data”。
测试页面:
<form action="提交地址" method="post" enctype="multipart/form-data"> <input type="text" name="info"/></br> <input type="file" name="filename"/> <input type="submit" value="上传"/> </form>
使用servlet来接收上传过来的文件项
1.导包
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
2.编写servlet来接收
package com.baidu.upload; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //获取磁盘工厂 DiskFileItemFactory dfif=new DiskFileItemFactory(); //获取核心类 ServletFileUpload sfu=new ServletFileUpload(dfif); //对核心类对象进行编码, 解决了文件名字中的乱码 sfu.setHeaderEncoding("UTF-8"); //获取提交参数集合(每一个表单项FileItem) List<FileItem> list = sfu.parseRequest(request); for (FileItem fileItem : list) { //判断是否是普通项 if (fileItem.isFormField()) { //普通项 String name = fileItem.getName(); String value = fileItem.getString("UTF-8"); System.out.println(name+" "+value); } else { //文件项 //获取文件的名字 String fieldName = fileItem.getName(); //设置服务器存储路径 String dir="C:\Users\Administrator\Desktop\develop"; //使用文件项流进行流的对接 fileItem.write(new File(dir,fieldName)); fileItem.delete(); } } } catch (Exception e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
文件的下载
下载的方式:自动下载和手动下载
自动下载:使用超链接的方式实现文件的下载
在<a href=”文件的路径”>超链接</a>
注意:超链接的方式,如果浏览器不能识别这种格式的文件,提示下载,如果支持该格式的文件,直接打开。
手动下载:设置两头一流
Context-Type :文件类型MIME。
Context-Disposition :浏览器支持该格式文件下载,提示下载。
输出流 :设置代表该文件的输入流(输出流是固定 response.getOutputStream())
package com.baidu.controller; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.baidu.utils.DownloadUtils; public class FileDownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接收参数 String filePath = request.getParameter("path");
//对接收来的数据进行重新编码 String fileName = new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8"); String file=filePath+"\"+fileName; //设置两头一流Content-type Content-disposition 文件输出流 String type = getServletContext().getMimeType(file);
//设置响应头部的类型 response.setContentType(type); response.setHeader("Content-Disposition", "attachment;filename="+file); //获取浏览器的类型 //String header = request.getHeader("User-Agent"); //if ("Firefox".equalsIgnoreCase(header)) { //file = DownloadUtils.base64EncodeFileName(file); //} else { //file = URLEncoder.encode(file,"UTF-8"); //}
//获取输入流对象 把要下载的文件作为输入流对象参数 InputStream ips=new FileInputStream(file);
//获取响应输出流对象 响应为页面 ServletOutputStream outputStream = response.getOutputStream(); int len=0; byte[] bt=new byte[1024*1024*3]; while((len=ips.read(bt))!=-1){ outputStream.write(bt, 0, len); } ips.close(); outputStream.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
使用Struts2文件上传
private File file; //对应前台的file的name属性 private String fileContentType; //对应File+ContextType private String fileFileName; //对应File+FileName; public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileContentType() { return fileContentType; } public void setFileContentType(String fileContentType) { this.fileContentType = fileContentType; } public String getFileFileName() { return fileFileName; } public void setFileFileName(String fileFileName) { this.fileFileName = fileFileName; } public String execute(){ try { FileUtils.copyFile(file, new File("E:/server",fileFileName)); } catch (IOException e) { e.printStackTrace(); } return SUCCESS; }
配置文件
<action name="upload" class="com.baidu.web.action.UploadAction" method="execute"> <result name="success">/success.jsp</result> <!-- 配置上传文件监听器 --> <interceptor-ref name="fileUpload"> <!-- 配置上传文件的大小 --> <param name="maximumSize"></param> <!-- 上传文件扩展名 --> <param name="allowedExtensions">bmp,txt,xml,doc,java</param> <!-- 设置上传文件允许的后缀名,多个使用逗号分开 --> <!-- 配置上传文件的类型 --> <param name="allowedTypesSet">application/java</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> </action>
多文件上传
private File[] file; //对应前台的file的name属性 private String[] fileContentType; //对应File+ContextType private String[] fileFileName; //对应File+FileName; public File[] getFile() { return file; } public void setFile(File[] file) { this.file = file; } public String[] getFileContentType() { return fileContentType; } public void setFileContentType(String[] fileContentType) { this.fileContentType = fileContentType; } public String[] getFileFileName() { return fileFileName; } public void setFileFileName(String[] fileFileName) { this.fileFileName = fileFileName; } public String execute(){ try { for (File f : file) { } for (int i = 0; i < file.length; i++) { FileUtils.copyFile(file[i], new File("E:/server",fileFileName[i])); } } catch (IOException e) { e.printStackTrace(); } return SUCCESS; }