您當前位置>首頁 » 新聞資(zī)訊 » 網站(zhàn)建設 >
Java Web開發中(zhōng)文(wén)件的上傳與下(xià)載
發表時間:2019-8-7
發布人:葵宇科技
浏覽次數:24
如(rú)何實現文(wén)件的上傳
實現Web開發中(zhōng)文(wén)件上傳功能的兩個(gè)步驟:
- 在Web頁面添加上傳輸入項
- 在Servlet中(zhōng)讀取上傳文(wén)件的數據并保存到本地硬盤中(zhōng)
由于大多數文(wén)件的上傳都是通(tōng)過表單 的形式提交給服務器(qì)的,故需要先創建一個(gè)用于提交上傳文(wén)件的表單頁面。
實現文(wén)件上傳的表單頁面需如(rú)下(xià)配置:
- 首先要創建一個(gè)用于提交上傳文(wén)件的表單頁面
- 在頁面中(zhōng),需要使用 < input type=“file”> 标簽在Web頁面中(zhōng)添加文(wén)件上傳輸入項
- 必須要設置input輸入項的name屬性,否則浏覽器(qì)将不會發送上傳文(wén)件的數據
- 必須把将表單頁面的method屬性設置為post方式,enctype屬性設置為 “multipart/form-data” 類型。
示例代碼:
<%--指定表單的enctype屬性以及提交方式--%>
<form enctype="multipart/form-data" method="post">
<%--指定标記的類型和(hé)文(wén)件域的名稱--%>
選擇上傳文(wén)件:< inpurt type="file" name="myfile"/><br />
</form>
Apache組織提供一個(gè)開源組件Commons-FileUpload,可(kě)以方便的将 “multipart/form-data” 類型請求中(zhōng)的各種表單域解析出來,并實現一個(gè)或多個(gè)文(wén)件的上傳,同時也可(kě)以限制上傳文(wén)件的大小等内容。使用時需要導入commons-fileupload.jar和(hé)commons-io.jar兩個(gè)JAR包,可(kě)去官網:"http://commons.apache.org/"下(xià)載(在網址頁面Apache Commons Proper下(xià)方表格的Components列中(zhōng)的FileUpload和(hé)IO)。
如(rú)何實現文(wén)件的下(xià)載
實現文(wén)件下(xià)載不需要使用第三方組件,直接使用Servlet類和(hé)輸入/輸出流即可(kě)。
與訪問(wèn)服務器(qì)文(wén)件不同的是,要實現文(wén)件的下(xià)載,不僅需要指定文(wén)件的路(lù)徑,還需要在HTTP協議中(zhōng)設置兩個(gè)響應消息頭:
//設置接受程序處理方式
Content-Disposition:attachment;filename=
//設定實體内容的MIME類型(多用途互聯網郵件擴展類型)
Content-Type:appliccation/x-msdownload
簡述文(wén)件下(xià)載的實現原理:
首先獲取下(xià)載文(wén)件的地址,并根據該地址創建文(wén)件字節輸入流,然後通(tōng)過該流讀取下(xià)載文(wén)件内容,最後将讀取的内容通(tōng)過輸出流寫到目标文(wén)件中(zhōng)。
實例問(wèn)題一:
請按照以下(xià)要求設計一個(gè)實現文(wén)件上傳的類UploadServlet?
要求如(rú)下(xià):
1) 已知form.html文(wén)件中(zhōng)form表單内定義了一個(gè)名為name的文(wén)本框及名為myfile的文(wén)件域,具備文(wén)件上傳的前提條件。
2)在doPost()方法中(zhōng),寫出文(wén)件上傳的相關(guān)代碼。
3)上傳的文(wén)件保存在當前應用程序的upload文(wén)件夾下(xià)。
解:UploadServlet代碼如(rú)下(xià):
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
try { // 創建工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File("e:\\Target"));
ServletFileUpload fileupload = new ServletFileUpload(factory); // 創建 fileupload 組件
fileupload.setHeaderEncoding("utf-8");
List<FileItem> fileitems = fileupload.parseRequest(request); // 解析 request
PrintWriter writer = response.getWriter();
for (FileItem fileitem : fileitems) { // 遍曆集合
if (fileitem.isFormField()) { // 判斷是否為普通(tōng)字段
String name = fileitem.getFieldName(); // 獲得字段名和(hé)字段值
String value = fileitem.getString("utf-8");
} else { // 上傳的文(wén)件路(lù)徑
String filename = fileitem.getName();
writer.print("文(wén)件來源:" + filename + "<br>");
filename = filename // 截取出文(wén)件名
.substring(filename.lastIndexOf("\\") + 1);
writer.print("成功上傳的文(wén)件:" + filename + "<br>");
filename = UUID.randomUUID().toString() + "_" + filename; // 文(wén)件名需要唯一
String webPath = "/upload/" + filename; // 在服務器(qì)創建同名文(wén)件
String path = getServletContext().getRealPath(webPath);
File file = new File(path); // 創建文(wén)件
file.getParentFile().mkdirs();
file.createNewFile();
InputStream in = fileitem.getInputStream(); // 獲得上傳文(wén)件流
OutputStream out = new FileOutputStream(file); // 獲得寫入文(wén)件流
byte[] buffer = new byte[1024]; // 流的對拷
int len;
while ((len = in.read(buffer)) > 0)
out.write(buffer, 0, len);
in.close(); // 關(guān)流
out.close();
fileitem.delete(); // 删除臨時文(wén)件
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
實例問(wèn)題二:
請編寫一個(gè)用于實現文(wén)件下(xià)載的程序,并且保證下(xià)載文(wén)件的文(wén)件名不能出現中(zhōng)文(wén)亂碼問(wèn)題?
解:
該功能的實現步驟如(rú)下(xià):
(1)創建下(xià)載頁面download.jsp
<%@ page language="java" import="java.util.*" 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>文(wén)件下(xià)載</title>
</head>
<body>
<a href="${pagContext.request.contextPath}/chapter06/DownloadServlet"}>
文(wén)件下(xià)載
</a>
<br />
</body>
</html>
(2)編寫DownloadServlet類,該類主要用于設置所要下(xià)載的文(wén)件以及文(wén)件在浏覽器(qì)中(zhōng)的打開方式,并使用 encode(String s, String enc) 方法,将URL中(zhōng)的字符串以指定的編碼形式輸出,防止文(wén)件名出現中(zhōng)文(wén)亂碼問(wèn)題
import java.io.*;
import java.net.URLEncoder;
import javax.servlet.*;
import javax.servlet.http.*;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 獲得絕對路(lù)徑創建文(wén)件對象
String path=getServletContext().getRealPath("/download/人物.jpg");
File file=new File(path);
// 通(tōng)知浏覽器(qì)以下(xià)載的方式打開文(wén)件
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition","attachment;filename="
+URLEncoder.encode(file.getName(),"utf-8"));
InputStream in=new FileInputStream(file); // 通(tōng)過文(wén)件對象獲取文(wén)件相關(guān)的輸入流
OutputStream out = response.getOutputStream(); // 獲取response對象的輸出流
byte [] buffer=new byte[1024];
int len;
while((len=in.read(buffer))!=-1){
out.write(buffer,0,len);
}
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
(3)使用IE浏覽器(qì)訪問(wèn)該download.jsp,單擊頁面中(zhōng)的文(wén)件下(xià)載鍊接後,即可(kě)保存下(xià)載該文(wén)件