天天看點

【檔案上傳和下載下傳-----JavaWeb實驗四】

題目描述

1、掌握檔案上傳、下載下傳的流程

2、熟悉FileItem接口和DiskFileItemFactory、ServletFileUpload類

3、熟悉檔案下載下傳中如何設定HTTP協定的響應消息頭

4、 掌握檔案上傳、下載下傳過程中資料流的傳遞。

實驗内容

1) 建立上傳頁面form.jsp,完成個人資訊(姓名 性别 年齡 照片)的資訊填寫。其中照片要上傳一張圖檔。

2) 建立UserBean,記錄姓名,性别,年齡,照片。

3) 建立UploadServlet類,用于擷取表單及上傳檔案的資訊,将資料儲存在UserBean中,将頁面跳轉至download.jsp,在download.jsp中提供照片下載下傳的超連結。

4) 編寫DownloadServlet類,完成照片下載下傳的功能。

代碼

//檔案上傳的伺服器:

//UploadServlet.java

package com.servlet;
import java.io.*;
import java.util.*;
import java.io.IOException;

import javax.management.RuntimeErrorException;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class fileServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UploadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			//解決亂碼問題
			response.setContentType("text/html;charset=utf-8");
			//建立DiskFileItemFactory工廠對象
			DiskFileItemFactory factory=new DiskFileItemFactory();
			//設定檔案緩存目錄,如果該目錄不存在則建立一個檔案
			File f=new File("E:\\TempFolder");
			if(!f.exists()) {
				f.mkdirs();
			}
			//設定檔案的緩存路徑
			factory.setRepository(f);
			//建立ServletFileUpload對象
			ServletFileUpload fileupload=new ServletFileUpload(factory);
			//設定字元編碼
			fileupload.setHeaderEncoding("utf-8");
			//解析request,得到上傳檔案的FileItem對象
			List<FileItem> fileitems=fileupload.parseRequest(request);
			//擷取字元流
			PrintWriter writer = response.getWriter();
			//周遊集合
			for(FileItem fileitem:fileitems) {
				//判斷是否為普通字段
				if(fileitem.isFormField()) {//如果fileitem中封裝的是普通輸入項的資料
					//獲得字段名和字段值
					String name=fileitem.getFieldName();
					if(name.equals("uname")) {
						//如果檔案不為空,将其儲存在value中
						if(!fileitem.getString().equals(" ")) {
							String value=fileitem.getString("utf-8");
							writer.print("姓名:"+value+"<br/>");
						}
					}
					if(name.equals("sex")) {
						if(!fileitem.getString().equals(" ")) {
							String value=fileitem.getString("utf-8");
							writer.print("性别:"+value+"<br/>");
						}
					}
					if(name.equals("age")) {
						if(!fileitem.getString().equals(" ")) {
							String value=fileitem.getString("utf-8");
							writer.print("年齡:"+value+"<br/>");
						}
					}
				}
				else {
					//擷取檔案的檔案名
					String filename=fileitem.getName();
					//處理上傳檔案
					if(filename!=null&& !filename.equals(" ")) {
						writer.print("圖檔名稱:"+filename+"<br/>");
						//截取出檔案名
						filename=filename.substring(filename.lastIndexOf("."));
						//檔案名唯一
						filename ="_img"+filename;//UUID.randomUUID().toString()+
						//在伺服器中建立同名檔案
						String webPath="D:\\javaee1\\test_file\\WebContent\\Upload\\";
						//将伺服器中檔案夾路徑與檔案名組成完整的伺服器路徑
						String filepath=webPath+filename;
						//建立檔案
						File file = new File(filepath);
						file.getParentFile().mkdirs();
						file.createNewFile();
						//獲得上傳檔案流
						InputStream in=fileitem.getInputStream();
						//使用FileOutputStream打開伺服器的上傳檔案
						FileOutputStream out=new FileOutputStream(file);
						//流的對拷
						byte[] buffer=new byte[1024];//每次讀取1個位元組
						int len;
						//開始讀取上傳檔案的位元組,并将其輸出到服務端的上傳檔案輸出流中
						while((len=in.read(buffer))>0)
							out.write(buffer,0,len);
						//關閉流
						in.close();
						out.close();
						//删除臨時檔案
						fileitem.delete();
						writer.print("圖像路徑:"+filepath+"<br/>");
						writer.print("檔案上傳成功!<br/>");
					}
				}
			}
						
		} catch (Error e) {
			throw new RuntimeErrorException(e);
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
           

//登入界面:

//Form.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="uname"><br/>
性别:<input type="text" name="sex"><br/>
年齡:<input type="text" name="age"><br/>
照片:<input type="file" name="img"><br/>
<input type="submit" value="送出">
</form>
</body>
</html>
           

//UserBean.java

package com.bean;
public class UserBean {
	private String name;
	private String sex;
	private String age;
	private String img_load;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getImg_load() {
		return img_load;
	}
	public void setImg_load(String img_load) {
		this.img_load = img_load;
	}	
}
           

運作截圖

基于個人隐私,部分輸入已打碼!

【檔案上傳和下載下傳-----JavaWeb實驗四】
【檔案上傳和下載下傳-----JavaWeb實驗四】
【檔案上傳和下載下傳-----JavaWeb實驗四】

實驗總結

(1) 之前學的解決亂碼的方法:可以再doGet()中書寫:response.setContentType(“text/html;charset=utf-8”);而解決亂碼時的新的方式是:fileitem.getString(“utf-8”)。

(2) 除了在之前引入的兩個jar包即servlet-api.jar和jsp-api.jar,還要再新引入兩個jar包即

commons-fileupload-1.3.1.jar和 commons-io-2.4.jar。可以解析表單域等。

(3) 在上傳檔案時,method屬性需要是post形式,并且Form表單的enctype="multipart/form-data。

(4) 隻要自己設定了預設上傳的路徑,如果該硬碟内沒有該路徑,那麼運作之後也會在該硬碟内生成一個該路徑,上邊就顯示了該圖檔,當然前提是得有這個硬碟。

(5) 标簽在使用時應當注意:必須設定input的name屬性,不然浏覽器将不會發送上傳檔案的資料;其二就是method=”post”。