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) */
        List itemList = 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
    
    
        

选择文件后点击上传按钮上传您的文件

enctype="multipart/form-data"> 文件一:
文件二:
年龄:
<?xml version="1.0" encoding="UTF-8"?>

  webFileUpload2
  
    fileUpload.jsp
  
  
      
      FileUploadServlet
      FileUploadServlet
      class>com.xzit.servlet.FileUploadServletclass>
  
  
      FileUploadServlet
      /file/FileUploadServlet
  
  
  
      
      DownloadServlet
      DownloadServlet
      class>com.xzit.servlet.DownloadServletclass>
  
  
      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