1. 程式人生 > >使用原生的Servlet封裝檔案上傳和下載

使用原生的Servlet封裝檔案上傳和下載

package com.love.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletContext;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.CopyUtils;


/**
 * Uploading And Downloading For Image--上傳和下載圖片
 * 
 * @author
 * @使用時要傳遞資訊
 * @1-upload:上傳圖片要儲存在伺服器的資料夾名稱
 * @2-method:up(上傳)或者down(下載)
 * @3-form表單中file-input:file-input框的name值為photo
 * @4-before,後加目標地址:上傳成功後會返回到一個目標地址
 * @5-filename,可以直接用request獲取:跳轉地址後會同時轉發一個新增圖片的名稱
 * @6-filename=xxxx.jpg:下載業務需要提供要下載的圖片的名稱
 * @7-upload值:下載業務需要提供要下載的圖片所在瀏覽器的目標資料夾
 * @8-id值:上傳業務時可以附帶一個id值(亦可不加),id為標誌性引數,不作任何處理,直接傳遞到下一個頁面
 */
@WebServlet("/UAD")
public class UAD extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* 重寫service方法
*/
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String method = request.getParameter("method");
if ("up".equals(method)) {
this.Uploading(request, response);
} else if ("down".equals(method)) {
this.Downloading(request, response);
} else {
System.out.println("沒有匹配的方法!");
}
}

/**
* 下載方法

* @param request
* @param response
* @throws IOException
*/
private void Downloading(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("下載服務啟動------");
// 獲取圖片在伺服器的資料夾名稱
String upload = request.getParameter("upload");
String fileName = request.getParameter("filename");
// 訊息頭
response.setContentType("application/octet-stream");// 流響應給瀏覽器
// 新增一個訊息頭 儲存 另存為 互動 下載檔案是中文要用URLEncoder.encoder();
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
// 獲取檔案在伺服器上的位置
// Servlet ========ServletContext========伺服器
ServletContext app = getServletContext();
String downloadPath = app.getRealPath(upload + File.separator + fileName);
File f = new File(downloadPath);
// 檔案複製
InputStream in = new FileInputStream(f);
OutputStream out = response.getOutputStream();
// jar包中自帶的工具
CopyUtils.copy(in, out);
System.out.println("yes");
}

/**
* 上傳方法

* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
private void Uploading(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("上傳服務啟動------");
// 獲取一個標誌性的id,不作處理,直接傳遞到下一個頁面
int id = 0;
if (request.getParameter("id") != null) {
id = Integer.parseInt(request.getParameter("id"));
System.out.println("UAD中拿到的id為:" + id);
}
// 獲取圖片在伺服器的資料夾名稱
String upload = request.getParameter("upload");
// 上傳完成後要跳轉的目標地址
String before = request.getParameter("before");
String filename = "";// 定義一個生成的檔名
// 獲取檔案--方式:磁碟檔案工廠
// 包名為:org.apache.commons.
FileItemFactory fif = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(fif);
// 解析request:FileItem 一個input框就是一個檔案條目
try {
// 獲取所有的input框
List<FileItem> parseRequest = sfu.parseRequest(request);
for (FileItem fi : parseRequest) {
// 判斷是否是上傳元件
if (fi.isFormField()) {
// 返回true即為普通元件
} else {
// 上傳元件
// 獲取伺服器路徑
ServletContext app = request.getSession().getServletContext();
// 開啟伺服器某個路徑
String realPath = app.getRealPath(upload);
// 獲取檔名稱--目的是為了獲取字尾
String finame = fi.getName();
// 擷取字尾--subString擷取字串--lastIndexOf,從最後一個""開始
String suffix = finame.substring(finame.lastIndexOf("."));
// 使用UUID類為檔案重新命名
String newname = UUID.randomUUID().toString();
// 拼接檔名稱,代表separator//或\\
String name = realPath + File.separator + newname + suffix;


filename = newname + suffix;// 獲取生成的檔名
File f = new File(name);// 根據檔名生成檔案
// 嚴謹性判斷
if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs();
}
// 寫入檔案
fi.write(f);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
request.setAttribute("filename", filename);
// request.setAttribute("id", id);
System.out.println("yes");
/* response.sendRedirect(request.getContextPath()+"/down.jsp"); */
request.getRequestDispatcher(before + "?id=" + id).forward(request, response);
}
}