知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當前位置>首頁 » 新聞資訊 » 網(wǎng)站建設 >
Java Web開發(fā)中文件的上傳與下載
發(fā)表時間:2019-8-7
發(fā)布人:葵宇科技
瀏覽次數(shù):46
如何實現(xiàn)文件的上傳
實現(xiàn)Web開發(fā)中文件上傳功能的兩個步驟:
- 在Web頁面添加上傳輸入項
- 在Servlet中讀取上傳文件的數(shù)據(jù)并保存到本地硬盤中
由于大多數(shù)文件的上傳都是通過表單 的形式提交給服務器的,故需要先創(chuàng)建一個用于提交上傳文件的表單頁面。
實現(xiàn)文件上傳的表單頁面需如下配置:
- 首先要創(chuàng)建一個用于提交上傳文件的表單頁面
- 在頁面中,需要使用 < input type=“file”> 標簽在Web頁面中添加文件上傳輸入項
- 必須要設置input輸入項的name屬性,否則瀏覽器將不會發(fā)送上傳文件的數(shù)據(jù)
- 必須把將表單頁面的method屬性設置為post方式,enctype屬性設置為 “multipart/form-data” 類型。
示例代碼:
<%--指定表單的enctype屬性以及提交方式--%>
<form enctype="multipart/form-data" method="post">
<%--指定標記的類型和文件域的名稱--%>
選擇上傳文件:< inpurt type="file" name="myfile"/><br />
</form>
Apache組織提供一個開源組件Commons-FileUpload,可以方便的將 “multipart/form-data” 類型請求中的各種表單域解析出來,并實現(xiàn)一個或多個文件的上傳,同時也可以限制上傳文件的大小等內(nèi)容。使用時需要導入commons-fileupload.jar和commons-io.jar兩個JAR包,可去官網(wǎng):"http://commons.apache.org/"下載(在網(wǎng)址頁面Apache Commons Proper下方表格的Components列中的FileUpload和IO)。
如何實現(xiàn)文件的下載
實現(xiàn)文件下載不需要使用第三方組件,直接使用Servlet類和輸入/輸出流即可。
與訪問服務器文件不同的是,要實現(xiàn)文件的下載,不僅需要指定文件的路徑,還需要在HTTP協(xié)議中設置兩個響應消息頭:
//設置接受程序處理方式
Content-Disposition:attachment;filename=
//設定實體內(nèi)容的MIME類型(多用途互聯(lián)網(wǎng)郵件擴展類型)
Content-Type:appliccation/x-msdownload
簡述文件下載的實現(xiàn)原理:
首先獲取下載文件的地址,并根據(jù)該地址創(chuàng)建文件字節(jié)輸入流,然后通過該流讀取下載文件內(nèi)容,最后將讀取的內(nèi)容通過輸出流寫到目標文件中。
實例問題一:
請按照以下要求設計一個實現(xiàn)文件上傳的類UploadServlet?
要求如下:
1) 已知form.html文件中form表單內(nèi)定義了一個名為name的文本框及名為myfile的文件域,具備文件上傳的前提條件。
2)在doPost()方法中,寫出文件上傳的相關(guān)代碼。
3)上傳的文件保存在當前應用程序的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; // 在服務器創(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]; // 流的對拷
int len;
while ((len = in.read(buffer)) > 0)
out.write(buffer, 0, len);
in.close(); // 關(guān)流
out.close();
fileitem.delete(); // 刪除臨時文件
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
實例問題二:
請編寫一個用于實現(xiàn)文件下載的程序,并且保證下載文件的文件名不能出現(xiàn)中文亂碼問題?
解:
該功能的實現(xiàn)步驟如下:
(1)創(chuàng)建下載頁面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類,該類主要用于設置所要下載的文件以及文件在瀏覽器中的打開方式,并使用 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");
// 獲得絕對路徑創(chuàng)建文件對象
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); // 通過文件對象獲取文件相關(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瀏覽器訪問該download.jsp,單擊頁面中的文件下載鏈接后,即可保存下載該文件
相關(guān)案例查看更多
相關(guān)閱讀
- 小程序設計
- web開發(fā)技術(shù)
- 云南小程序被騙
- 云南網(wǎng)站維護
- 云南網(wǎng)站建設一條龍
- 網(wǎng)站建設制作
- 網(wǎng)站開發(fā)
- 云南網(wǎng)站建設列表網(wǎng)
- 微信分銷
- 網(wǎng)站搭建
- 網(wǎng)站建設專業(yè)品牌
- 小程序被攻擊
- 小程序開發(fā)費用
- 前端
- 云南省建設廳官方網(wǎng)站
- 定制小程序開發(fā)
- 云南旅游網(wǎng)站建設
- 網(wǎng)站制作哪家好
- 保山小程序開發(fā)
- 網(wǎng)絡公司哪家好
- 大理小程序開發(fā)
- 迪慶小程序開發(fā)
- 云南企業(yè)網(wǎng)站
- 網(wǎng)站開發(fā)公司哪家好
- 海南小程序制作公司
- 云南網(wǎng)站建設專業(yè)品牌
- 小程序開發(fā)聯(lián)系方式
- 云南網(wǎng)絡營銷
- 北京小程序開發(fā)
- 紅河小程序開發(fā)