JavaWeb文件上传与下载
<a href="file/DownloadServlet?fileId=QQ图片3.jpg">QQ图片3a><br>
当超链接配置了file/路径的时候,response.sendRedirect("tip.jsp")
会从file路径下找tip.jsp这个文件,因为没有file这个路径所以tip.jsp会找不到。解决的办法是跳转上一级目录response.sendRedirect("../tip.jsp")
因为在web.xml中<url-pattern>/file/DownloadServleturl-pattern>
配置的第一条/斜线就代表根目录,跳转到根目录就能找到tip.jsp文件了
package com.xzit.servlet; import java.io.File; import java.io.IOException; import java.util.Date; 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.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private String uploadSaveDir; /** * 处理用文件上传请求的核心服务方法 * @param request 请求对象 * @param response 响应对象 */ protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ //上传文件保存的目录 uploadSaveDir = this.getServletContext().getRealPath("/WEB-INF/uploadFiles/"); System.out.println("文件保存的真实目录"+uploadSaveDir); /* 创建默认属性设置的磁盘文件项工厂对象 */ DiskFileItemFactory factory = new DiskFileItemFactory(); System.out.println("默认文件保存的临时目录是 "+System.getProperty("java.io.tmpdir")); System.out.println(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); /* 构建ServletFileUpload组件 */ ServletFileUpload fileUpload = new ServletFileUpload(); //设置使用的FileItemFactory fileUpload.setFileItemFactory(factory); /* 设置相关属性 */ fileUpload.setFileSizeMax(1024*1024*12); fileUpload.setSizeMax(1024*1024*12*10); fileUpload.setHeaderEncoding("utf-8"); /* 获取FileItemFactory所有文件项(FileItem) */ ListitemList = null; try { itemList = fileUpload.parseRequest(request); for(FileItem item:itemList) {//遍历List //判断是普通表单字段还是文件组件 boolean bool = item.isFormField(); if(!bool) {//如果是文件对象则保存到磁盘 String fileName = item.getName(); //获取上传文件的真实名称 System.out.println("文件名称:"+fileName); System.out.println("字段名称:"+item.getFieldName()); System.out.println("文件的大小是:"+item.getSize()); System.out.println("文件类型是 "+item.getContentType()); File target = new File(uploadSaveDir+new Date().getTime()+fileName); item.write(target); } item.delete();//释放Item内容主体 } } catch (Exception e) { e.printStackTrace(); } } }
package com.xzit.servlet; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; 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; public class DownloadServlet extends HttpServlet { private String dir ;//下载文件所在父目录 protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ String id = request.getParameter("fileId");//获取下载链接的文件id参数 dir = getServletContext().getRealPath("/WEB-INF/downloads/"); //建立下载的目标文件 File target = new File(dir+id); InputStream input = null; ServletOutputStream output = null; if(target.exists()) { input = new FileInputStream(target); //设置文件临时存储的缓冲区 byte [] datas = new byte[10240]; int count = 0; //读取字节的计数器 //设置响应头内容,告知浏览器本次响应是文件下载 response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(target.getName(),"UTF-8")); output = response.getOutputStream();//获取响应给客户端的文件输出流 /* 读取文件到缓冲区,响应发送输出流到客户端浏览器 */ while((count = input.read(datas, 0, datas.length)) > 0) { output.write(datas, 0, count);//输入到客户端 } output.flush(); output.close(); input.close(); }else {//如果不存在 response.sendRedirect("../tip.jsp");//定位到提示页面 } } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here 选择文件后点击上传按钮上传您的文件
<?xml version="1.0" encoding="UTF-8"?>webFileUpload2 fileUpload.jsp FileUploadServlet FileUploadServlet class>com.xzit.servlet.FileUploadServlet class>FileUploadServlet /file/FileUploadServlet DownloadServlet DownloadServlet class>com.xzit.servlet.DownloadServlet class>DownloadServlet /file/DownloadServlet
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here 目标文件不存在,无法下载,很抱歉
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here <% request.setCharacterEncoding("utf-8"); %>资源下载列表
QQ图片1
QQ图片2
QQ图片3