Java實現圖片的上傳以及下載 Tomcat伺服器
阿新 • • 發佈:2019-02-20
上傳頁面的程式碼:
處理上傳的Servlet程式碼:<%@ 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>Insert title here</title> </head> <body> <form method="post" action="BookServlet" ENCTYPE="multipart/form-data"> 姓名:<input type = "text" name = "name"> 價格:<input type = "text" name ="price"> 檔案:<input type="file" name="file"> <button type = "submit">上傳</button> </form> </body> </html>
package cn.edu.uestc.DataUtil; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Field; import java.util.Iterator; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import cn.edu.uestc.Bean.BookInfo; public class BookServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 5851632898969968329L; public BookServlet() { super(); } public void destroy() { super.destroy(); } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 以判斷出提交過來的表單是否為檔案上傳表單 boolean isMultipart = ServletFileUpload.isMultipartContent(request); PrintWriter out; out = response.getWriter(); Class<BookInfo> clazz = BookInfo.class; BookInfo bookInfo; try { // 建立此 Class 物件所表示的類的一個新例項。 bookInfo = (BookInfo) clazz.newInstance(); if (isMultipart) { // 構造了一個檔案上傳處理物件 FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); // 提交的所有檔案內容 List<FileItem> fileItemList = upload.parseRequest(request); for (FileItem fileItem : fileItemList) { if (fileItem.isFormField()) { try { // 返回一個 Field 物件,該物件反映此 Class 物件所表示的類或介面的指定已宣告欄位。 Field field = clazz.getDeclaredField(fileItem.getFieldName()); field.setAccessible(true); // 避免private不可訪問丟擲異常 try { // 將指定物件變數上此 Field 物件表示的欄位設定為指定的新值。 field.set(bookInfo, new String(fileItem.get(), "utf-8")); } catch (Exception e) { field.set(bookInfo, Double.valueOf(new String(fileItem.get(), "utf-8"))); } } catch (Exception e) { continue; } } else { String name = fileItem.getName(); String uid = UUID.randomUUID() + name.substring(name.lastIndexOf('.')); bookInfo.setPath(uid); // 獲取images的路徑 String path = request.getSession().getServletContext().getRealPath("images") + File.separatorChar + uid; // 把上傳的檔案儲存到伺服器中,完成上傳操作 File file = new File(path); fileItem.write(file); } } } boolean result = Data_Util.insert(bookInfo); if (result) { response.sendRedirect("BookServletFind"); } else { // out.print("<script>alert('新增shibai!')</script>"); } } catch (Exception e) { e.printStackTrace(); } } }
下載頁面程式碼:
下載Servlet程式碼:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!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>Insert title here</title> </head> <body> <table> <thead> <tr> <th>書名</th> <th>價格</th> <th>封面</th> </tr> </thead> <tbody> <c:forEach var="bookInfo" items="${bookInfoList}"> <tr> <td>${bookInfo.name }</td> <td>${bookInfo.price }</td> <td><a href="#"> <img height="50" width="50" src="../images/${bookInfo.path }" /> </a></td> <td><a href = "download?imgName=${bookInfo.path }">下載</a></td> </tr> </c:forEach> </tbody> </table> </body> </html>
package cn.edu.uestc.DataUtil;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Content/download")
public class ImgDownLoadServlet extends HttpServlet
{
private static final long serialVersionUID = 6780523201093270778L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
try
{
String path = request.getSession().getServletContext().getRealPath("images") + File.separatorChar;
//得到下載圖片的名字
String fname = request.getParameter("imgName");
//建立file物件
File file = new File(path + fname);
//設定response的編碼方式
response.setContentType("image/jpeg");// 定義輸出型別
response.setCharacterEncoding("UTF-8");
fname = java.net.URLEncoder.encode(fname, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fname);
//讀出檔案到I/O流
FileInputStream stream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(stream);
byte[] b = new byte[1024];//相當於快取
long k = 0;//該值用於計算當前實際下載了多少位元組
//從response物件總得到輸出流,準備下載
OutputStream myout = response.getOutputStream();
//開始迴圈下載
while (k < file.length())
{
int j = bufferedInputStream.read(b, 0, 1024);
k += j;
//將b中的資料寫到客戶端的記憶體
myout.write(b, 0, j);
}
//將寫入客戶端記憶體的資料,重新整理到磁碟
myout.flush();
} catch (Exception e)
{
System.out.println(e);
}
}
}