1. 程式人生 > >Java實現圖片的上傳以及下載 Tomcat伺服器

Java實現圖片的上傳以及下載 Tomcat伺服器

上傳頁面的程式碼:

<%@ 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>
處理上傳的Servlet程式碼:
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();
		}

	}

}

下載頁面程式碼:
<%@ 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>
下載Servlet程式碼:
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);
		}
	}

}