javaWeb上传与下载
上传:
上传方式:
jspSmartUpload :应用在jsp上的文件上传与下载组件。
FileUpload :用用在jaava环境上的上传的功能
Servlet3.0 :提供了文件上传功能
Struts2 :提供文件上传的功能
这里主要讲述FileUpload上传和下载
上传三要素:
1.提交的方式必须是post(因为get提交的内容大小是有限制的)
2.表单中需要有<input type=”file”>元素,需要有name属性和值。
3.表单enctype=”multipart/form-data”。
测试页面:
1 2 3 4 5 | <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来接收
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 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())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | 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" );<br> //对接收来的数据进行重新编码 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);<br> //设置响应头部的类型 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"); //}<br> //获取输入流对象 把要下载的文件作为输入流对象参数 InputStream ips= new FileInputStream(file);<br> //获取响应输出流对象 响应为页面 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文件上传
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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; } |
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | < 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 > |
多文件上传
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步