1. 程式人生 > >java:檔案上傳與下載

java:檔案上傳與下載

一.檔案上傳

1.注意:

  • jsp提交方式必須為post

  • 必須採用複雜格式 : enctype=“multipart/form-data”

    <form action="/upload" method="post" enctype="multipart/form-data">
    
  • 需要commons-fileupload.jar來解析multipart/form-data格式,並且要依賴commons-io.jar

2.程式碼如下:

update.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<p> 姓名<input type="text" name="name"></p>
<p><input type="file" name="img"> ${requestScope.error}</p>
<p><input type="submit" value="提交"></p>
</form>
 </body>
</html>

UpdateServlet:

@WebServlet(urlPatterns = "/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //提前建立儲存圖片的目錄
    new File("e:\\images").mkdirs();
    //將上傳的檔案存入伺服器磁碟的一個工具類
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //核心檔案上傳工具類
    ServletFileUpload fileUpload = new ServletFileUpload(factory);
    fileUpload.setSizeMax(1024*1024); 
    try {
        //list對應表單的資料集合,其中每一項抽象為了FileItem(文字框,檔案,複選框...)
        List<FileItem> list = fileUpload.parseRequest(req);
        //遍歷集合
        for (FileItem item : list) {
            //如果是普通表單選項
            if(item.isFormField()){
                System.out.println("引數名:"+item.getFieldName());
                System.out.println("值:"+item.getString("UTF-8"));
            }else {
                //否則不是一個普通表單項,是一個檔案
                System.out.println("得到檔案長度:"+item.getSize());
                if(item.getSize()>0){
                    System.out.println("檔案的原始名:"+item.getName());
                    item.write(new File("e:\\images\\"+item.getName()));
                }
                }
            System.out.println("===============================");
        }
    }
    catch (FileUploadBase.SizeLimitExceededException e) {
        req.setAttribute("error", "上傳的檔案超過了大小限制");
        req.getRequestDispatcher("/upload.jsp").forward(req, resp);
    }
    catch (FileUploadException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    }
}

二.檔案下載

1.DownloadServlet程式碼:

@WebServlet(urlPatterns = "/download/*")
 public class DownloadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 1) 當響應的 content-type 設定為image,瀏覽器會顯示圖片
    resp.setContentType("image/jpg");

    // 2) 如果要把圖片進行下載操作
    resp.setContentType("application/octet-stream");//二進位制流,當不知道下載檔案的型別是用
    //讓瀏覽器預設下載而非展現這張圖,並且以1.jpg的名字儲存。
    resp.addHeader("content-disposition","attachment;filename=new.jpg");

    // 把【瀏覽器的路徑】 轉換為 【伺服器的磁碟路徑】
    String uri = req.getRequestURI(); // 獲取瀏覽器實際輸入路徑
    System.out.println(uri);
    String path = "E:\\" + uri;// 圖片的磁碟路徑
    // 如果檔案不存在,返回404
    if( !new File(path).exists() ) {
        resp.sendError(404);
       return;
    }
    // 如果存在,從檔案輸入流讀取,向響應的輸出流寫
    FileInputStream is = new FileInputStream(path);
    OutputStream os = resp.getOutputStream();
    IOUtils.copy(is, os);
    IOUtils.closeQuietly(is);
}
}

2.注意:上述程式碼中有如下一段程式碼

// 2) 如果要把圖片進行下載操作
    resp.setContentType("application/octet-stream");//二進位制流,當不知道下載檔案的型別是用
    //讓瀏覽器預設下載而非展現這張圖,並且以1.jpg的名字儲存。
    resp.addHeader("content-disposition","attachment;filename=new.jpg");

二進流不知道檔案型別時用application/octet-stream如下圖:
在這裡插入圖片描述