### 文件上传下载

- 文件上传

- 客户端

  1、input 的 type 设置为 file。

  2、form 表单的 method 设置为 post(get 会将文件名传给后台,而非文件本身)

  3、form 表单的 enctype 设置为 multipart/form-data (以二进制的形式传输数据)

- 服务端

  commons-fileupload,commons-io

  基本思想:commons-fileupload 可以解析请求,得到一个泛型为 FileItem 的集合。

  commons-fileupload 可以将所有的请求信息都解析成 FileItem 对象,无论是表单域还是文件域。

  开发者就可以对 FileItem 集合进行操作,从而完成上传。

  上传组件可以将传来的二进制数据解析成一个集合,进而方便开发。

```jsp
<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-28
  Time: 20:16
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/upload.do" enctype="multipart/form-data" method="post">
        <input type="file" name="img"/>
        <input type="text" name="desc"/>
        <input type="submit" value="上传"/>
    </form>
</body>
</html>
```



```java
package com.southwind.controller;

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;

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 java.io.*;
import java.util.List;

@WebServlet("/upload.do")
public class UploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
        //创建DiskFileItemFactory
        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
        //创建文件解析器
        ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
        //获取FileItem集合
        try {
            List<FileItem> list = upload.parseRequest(req);
            //遍历list
            for (FileItem fileItem:list){
                if(!fileItem.isFormField()){
                    String fileName = fileItem.getName();
                    try {
                        InputStream inputStream = fileItem.getInputStream();
                        String path = req.getServletContext().getRealPath("");
                        OutputStream outputStream = new FileOutputStream(path+"/files/"+fileName);
                        int temp = 0;
                        while((temp=inputStream.read())!=-1){
                            outputStream.write(temp);
                        }
                        inputStream.close();
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }

    }
}
```



- 文件下载

```jsp
<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-28
  Time: 21:43
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="/download.do">1.png</a>
</body>
</html>
```



```java
package com.southwind.controller;

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 java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

@WebServlet("/download.do")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/x-msdownload");
        String fileName = "1.png";
        resp.setHeader("Content-Disposition","attachment;filename="+fileName);
        OutputStream outputStream = resp.getOutputStream();
        String path = req.getServletContext().getRealPath("")+"/files/"+fileName;
        InputStream inputStream = new FileInputStream(path);
        int temp = 0;
        while((temp = inputStream.read())!=-1){
            outputStream.write(temp);
        }
        outputStream.close();
        inputStream.close();
    }
}
```

 

 download.jsp

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-28
  Time: 21:43
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="/download.do">1.png</a>
    <a href="/download.do">1.png</a>
</body>
</html>

 

upload.jsp

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-28
  Time: 20:16
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/upload.do" enctype="multipart/form-data" method="post">
        <input type="file" name="img"/>
        <input type="text" name="desc"/>
        <input type="submit" value="上传"/>
    </form>
</body>
</html>

 

 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

 

 

 

 

 

 DownloadServlet.java

package com.southwind.controller;

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 java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

@WebServlet("/download.do")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        resp.setContentType("application/x-msdownload");
        String fileName = "1.png";
        resp.setHeader("Content-Disposition","attachment;filename="+fileName);
        OutputStream outputStream = resp.getOutputStream();
        String path = req.getServletContext().getRealPath("")+"/files/"+fileName;
        InputStream inputStream = new FileInputStream(path);
        int temp = 0;
        while((temp = inputStream.read())!=-1){
            outputStream.write(temp);
        }
        outputStream.close();
        inputStream.close();
    }
}

 

UploadServlet.java

package com.southwind.controller;

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;

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 java.io.*;
import java.util.List;

@WebServlet("/upload.do")
public class UploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
        //创建DiskFileItemFactory
        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
        //创建文件解析器
        ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
        //获取FileItem集合
        try {
            List<FileItem> list = upload.parseRequest(req);
            //遍历list
            for (FileItem fileItem:list){
                if(!fileItem.isFormField()){
                    String fileName = fileItem.getName();
                    try {
                        InputStream inputStream = fileItem.getInputStream();
                        String path = req.getServletContext().getRealPath("");
                        OutputStream outputStream = new FileOutputStream(path+"/files/"+fileName);
                        int temp = 0;
                        while((temp=inputStream.read())!=-1){
                            outputStream.write(temp);
                        }
                        inputStream.close();
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }

    }
}

 

posted on 2019-09-18 07:32  HiJackykun  阅读(318)  评论(0编辑  收藏  举报