知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 網(wǎng)站建設(shè) >
Java Web開發(fā)中文件的上傳與下載
發(fā)表時(shí)間:2019-8-7
發(fā)布人:葵宇科技
瀏覽次數(shù):46
如何實(shí)現(xiàn)文件的上傳
實(shí)現(xiàn)Web開發(fā)中文件上傳功能的兩個(gè)步驟:
- 在Web頁(yè)面添加上傳輸入項(xiàng)
- 在Servlet中讀取上傳文件的數(shù)據(jù)并保存到本地硬盤中
由于大多數(shù)文件的上傳都是通過表單 的形式提交給服務(wù)器的,故需要先創(chuàng)建一個(gè)用于提交上傳文件的表單頁(yè)面。
實(shí)現(xiàn)文件上傳的表單頁(yè)面需如下配置:
- 首先要創(chuàng)建一個(gè)用于提交上傳文件的表單頁(yè)面
- 在頁(yè)面中,需要使用 < input type=“file”> 標(biāo)簽在Web頁(yè)面中添加文件上傳輸入項(xiàng)
- 必須要設(shè)置input輸入項(xiàng)的name屬性,否則瀏覽器將不會(huì)發(fā)送上傳文件的數(shù)據(jù)
- 必須把將表單頁(yè)面的method屬性設(shè)置為post方式,enctype屬性設(shè)置為 “multipart/form-data” 類型。
示例代碼:
<%--指定表單的enctype屬性以及提交方式--%>
<form enctype="multipart/form-data" method="post">
<%--指定標(biāo)記的類型和文件域的名稱--%>
選擇上傳文件:< inpurt type="file" name="myfile"/><br />
</form>
Apache組織提供一個(gè)開源組件Commons-FileUpload,可以方便的將 “multipart/form-data” 類型請(qǐng)求中的各種表單域解析出來,并實(shí)現(xiàn)一個(gè)或多個(gè)文件的上傳,同時(shí)也可以限制上傳文件的大小等內(nèi)容。使用時(shí)需要導(dǎo)入commons-fileupload.jar和commons-io.jar兩個(gè)JAR包,可去官網(wǎng):"http://commons.apache.org/"下載(在網(wǎng)址頁(yè)面Apache Commons Proper下方表格的Components列中的FileUpload和IO)。
如何實(shí)現(xiàn)文件的下載
實(shí)現(xiàn)文件下載不需要使用第三方組件,直接使用Servlet類和輸入/輸出流即可。
與訪問服務(wù)器文件不同的是,要實(shí)現(xiàn)文件的下載,不僅需要指定文件的路徑,還需要在HTTP協(xié)議中設(shè)置兩個(gè)響應(yīng)消息頭:
//設(shè)置接受程序處理方式
Content-Disposition:attachment;filename=
//設(shè)定實(shí)體內(nèi)容的MIME類型(多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型)
Content-Type:appliccation/x-msdownload
簡(jiǎn)述文件下載的實(shí)現(xiàn)原理:
首先獲取下載文件的地址,并根據(jù)該地址創(chuàng)建文件字節(jié)輸入流,然后通過該流讀取下載文件內(nèi)容,最后將讀取的內(nèi)容通過輸出流寫到目標(biāo)文件中。
實(shí)例問題一:
請(qǐng)按照以下要求設(shè)計(jì)一個(gè)實(shí)現(xiàn)文件上傳的類UploadServlet?
要求如下:
1) 已知form.html文件中form表單內(nèi)定義了一個(gè)名為name的文本框及名為myfile的文件域,具備文件上傳的前提條件。
2)在doPost()方法中,寫出文件上傳的相關(guān)代碼。
3)上傳的文件保存在當(dāng)前應(yīng)用程序的upload文件夾下。
解:UploadServlet代碼如下:
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
try { // 創(chuàng)建工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File("e:\\Target"));
ServletFileUpload fileupload = new ServletFileUpload(factory); // 創(chuàng)建 fileupload 組件
fileupload.setHeaderEncoding("utf-8");
List<FileItem> fileitems = fileupload.parseRequest(request); // 解析 request
PrintWriter writer = response.getWriter();
for (FileItem fileitem : fileitems) { // 遍歷集合
if (fileitem.isFormField()) { // 判斷是否為普通字段
String name = fileitem.getFieldName(); // 獲得字段名和字段值
String value = fileitem.getString("utf-8");
} else { // 上傳的文件路徑
String filename = fileitem.getName();
writer.print("文件來源:" + filename + "<br>");
filename = filename // 截取出文件名
.substring(filename.lastIndexOf("\\") + 1);
writer.print("成功上傳的文件:" + filename + "<br>");
filename = UUID.randomUUID().toString() + "_" + filename; // 文件名需要唯一
String webPath = "/upload/" + filename; // 在服務(wù)器創(chuàng)建同名文件
String path = getServletContext().getRealPath(webPath);
File file = new File(path); // 創(chuàng)建文件
file.getParentFile().mkdirs();
file.createNewFile();
InputStream in = fileitem.getInputStream(); // 獲得上傳文件流
OutputStream out = new FileOutputStream(file); // 獲得寫入文件流
byte[] buffer = new byte[1024]; // 流的對(duì)拷
int len;
while ((len = in.read(buffer)) > 0)
out.write(buffer, 0, len);
in.close(); // 關(guān)流
out.close();
fileitem.delete(); // 刪除臨時(shí)文件
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
實(shí)例問題二:
請(qǐng)編寫一個(gè)用于實(shí)現(xiàn)文件下載的程序,并且保證下載文件的文件名不能出現(xiàn)中文亂碼問題?
解:
該功能的實(shí)現(xiàn)步驟如下:
(1)創(chuàng)建下載頁(yè)面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>文件下載</title>
</head>
<body>
<a href="${pagContext.request.contextPath}/chapter06/DownloadServlet"}>
文件下載
</a>
<br />
</body>
</html>
(2)編寫DownloadServlet類,該類主要用于設(shè)置所要下載的文件以及文件在瀏覽器中的打開方式,并使用 encode(String s, String enc) 方法,將URL中的字符串以指定的編碼形式輸出,防止文件名出現(xià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");
// 獲得絕對(duì)路徑創(chuàng)建文件對(duì)象
String path=getServletContext().getRealPath("/download/人物.jpg");
File file=new File(path);
// 通知瀏覽器以下載的方式打開文件
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition","attachment;filename="
+URLEncoder.encode(file.getName(),"utf-8"));
InputStream in=new FileInputStream(file); // 通過文件對(duì)象獲取文件相關(guān)的輸入流
OutputStream out = response.getOutputStream(); // 獲取response對(duì)象的輸出流
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瀏覽器訪問該download.jsp,單擊頁(yè)面中的文件下載鏈接后,即可保存下載該文件
相關(guān)案例查看更多
相關(guān)閱讀
- 云南做網(wǎng)站
- 正規(guī)網(wǎng)站建設(shè)公司
- 網(wǎng)站建設(shè)高手
- 云南小程序開發(fā)公司
- 云南etc微信小程序
- web開發(fā)
- 網(wǎng)站建設(shè)專業(yè)品牌
- python開發(fā)小程序
- 買小程序被騙
- 公眾號(hào)模板消息
- 曲靖小程序開發(fā)
- 網(wǎng)站建設(shè)首頁(yè)
- 網(wǎng)站建設(shè)招商
- web學(xué)習(xí)路線
- 開發(fā)制作小程序
- 云南網(wǎng)站建設(shè)服務(wù)公司
- 北京小程序開發(fā)
- 云南省建設(shè)廳官方網(wǎng)站
- 云南網(wǎng)站建設(shè)高手
- 云南網(wǎng)站建設(shè)首頁(yè)
- 網(wǎng)站建設(shè)哪家強(qiáng)
- 云南小程序被騙蔣軍
- 昆明小程序設(shè)計(jì)
- 網(wǎng)站建設(shè)制作
- 云南網(wǎng)站建設(shè)哪家公司好
- 昆明網(wǎng)站建設(shè)公司
- 網(wǎng)站沒排名
- 云南網(wǎng)站建設(shè)公司地址
- 北京小程序制作
- 保險(xiǎn)網(wǎng)站建設(shè)公司