Java Web開發中(zhōng)文(wén)件的上傳與下(xià)載 - 新聞資(zī)訊 - 雲南小程序開發|雲南軟件開發|雲南網站(zhàn)建設-西山區知普網絡科技工作室

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不管是網站(zhàn),軟件還是小程序,都要直接或間接能為您産生價值,我們在追求其視覺表現的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站(zhàn)成為營銷工具,讓軟件能切實提升企業(yè)内部管理水平和(hé)效率。優秀的程序為後期升級提供便捷的支持!

您當前位置>首頁 » 新聞資(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à)配置:

  1. 首先要創建一個(gè)用于提交上傳文(wén)件的表單頁面
  2. 在頁面中(zhōng),需要使用 < input type=“file”> 标簽在Web頁面中(zhōng)添加文(wén)件上傳輸入項
  3. 必須要設置input輸入項的name屬性,否則浏覽器(qì)将不會發送上傳文(wén)件的數據
  4. 必須把将表單頁面的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)件

相關(guān)案例查看更多