題目描述
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;
}
}
運作截圖
基于個人隐私,部分輸入已打碼!
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL1UERNhXT65EMRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxMDN2QzM1kTM4AjMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
實驗總結
(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”。