Java Web Day10

本节内容

1.文件上传与下载

一、文件上传

 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。

  对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

 form表单提交的数据类型:enctype  :普通参数提交application/x-www-form-urlencoded

文件上传  数据类型:multipart/form-data

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
</head>
<body>

  <form action="../UpLoadServlet" method="post" enctype="multipart/form-data">
  <input type="file" name="file1"/><br/>
  
  <input type="file" name="file1"/><br/>
  <input type="text" name="username"/><br/> 
  <input type="submit" value="上传"/>
  </form>

</body>
</html>
View Code
package com.xk.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;

/**
 * 文件上传
 * 
 * @author 27783
 *
 */
@WebServlet("/UpLoadServlet")
public class UpLoadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 建立把保存文件上传的目录
        String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");

        File file = new File(savePath);

        // 判断上传文件的保存目录是否存在
        if (!file.exists() && !file.isDirectory()) {
            System.out.println(savePath + "目录不存在,需要创建");
            // 创建目录
            file.mkdir();
        }
        // 上传消息提示
        String message = "";

        // 使用Apache文件上传组件处理文件上传步骤:

        // 1、创建一个DiskFileItemFactory工厂

        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();

        // 2、创建一个文件上传解析器
        ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);

        // 3、判断提交上来的数据是否是上传表单的数据
        if (!ServletFileUpload.isMultipartContent(request)) {

            return;
        }
        // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
        // 解决上传文件名的中文乱码
        fileUpload.setHeaderEncoding("utf-8");
        try {
            List<FileItem> listFileitem = fileUpload.parseRequest(request);

            for (FileItem item : listFileitem) {
                // 如果fileitem中封装的是普通输入项的数据

                if (item.isFormField()) {

                    String name = item.getFieldName();

                    // 解决普通输入项的数据的中文乱码问题
                    String value = item.getString("utf-8");

                    System.out.println(name + " " + value);
                } else {
                    // 如果fileitem中封装的是上传文件
                    // 得到上传的文件名称,
                    String filename = item.getName();
                    // 如果文件名为空跳过
                    if (filename == null || filename.trim().equals("")) {
                        continue;
                    }
                    // 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
                    // c:a1.txt,而有些只是单纯的文件名,如:1.txt
                    // 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
                    filename = filename.substring(filename.lastIndexOf("\") + 1);
                    // 获取item中的上传文件的输入流
                    InputStream in = item.getInputStream();
                    // 创建一个文件输出流
                    FileOutputStream out = new FileOutputStream(savePath + "\" + filename);
                    // 创建一个缓冲区
                    byte buffer[] = new byte[1024];
                    // 判断输入流中的数据是否已经读完的标识
                    int len = 0;
                    // 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
                    while ((len = in.read(buffer)) > 0) {
                        // 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\"
                        // + filename)当中
                        out.write(buffer, 0, len);
                    }

                    // 关闭输入流
                    in.close();
                    // 关闭输出流
                    out.close();
                    // 删除处理文件上传时生成的临时文件
                    item.delete();
                    message = "文件上传成功!";

                }

            }

        } catch (FileUploadException e) {
            message = "文件上传失败!";

        }
    }

}
View Code

文件下载:

我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFileServlet,用于列出Web应用系统中所有下载文

 
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>文件下载</title>
</head>
<body>

 <%
   String  fail=(String)request.getAttribute("fileinfo");
 
   if("fial".equals(fail)){%>
       
     <script type="text/javascript">
  
  
  alert("文件已不存在");
  
  
  </script>   
       
       
       
  <% }
 
 %>

 

<a href="DowloadServlet?filename=Oracle第五天1.mm">Oracle第五天.mm</a>

</body>
</html>
View Code
package com.xk;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class DowloadServlet
 */
@WebServlet("/DowloadServlet")
public class DowloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
   
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         
        String filename=request.getParameter("filename");
         
        System.out.println(filename);
     String savePath="G:"+File.separatorChar+"upload";
      
     File file = new File(savePath);
     
     File[] listFile= file.listFiles();
     
     
       for(File files:listFile){
           
           if(files.isFile()){
               //文件名
            if(filename.equals(files.getName())){
                
                //文件存在
                 response.setContentType("application/octet-stream");
                 response.setHeader("content-disposition", "attachment;filename=""+filename+""");
                 File dowloadFile=new File(savePath+File.separatorChar+files.getName());
                 FileInputStream in = new FileInputStream(dowloadFile);

                OutputStream out= response.getOutputStream();
                 byte[] b=new byte[1024];
                 int len=0;
                 while ((len=in.read(b))!=-1) {
                     
                      out.write(b, 0, len);
                     
                    
                }
                 
                 out.close();
                 in.close();
                 return;
                
            } 
   
           }
           
           
           
           
           
           
           
       }
     
        //文件不存在
       response.setContentType("text/html;charset=utf-8");
       request.setAttribute("fileinfo", "fial");
       
       request.getRequestDispatcher("/index1.jsp").forward(request, response); 
        
        
    }

     

}
View Code
 
 
 
原文地址:https://www.cnblogs.com/wuzhilong/p/9518923.html