http與檔案傳輸
如何實現檔案傳輸?
使用http來實現
Content-Type:application/x-www-form-urlencoded ==> 請求體為經過url編碼的字串
Content-Type:multipart/form-data ==> 請求體二進位制資料,並以邊界boundary來分割field,每一個可以設定下一級的資料型別Content-Type;http資訊傳輸方式在form中的實現
設定form的屬性ENCTYPE=”application/x-www-form-urlencoded”(預設)
設定form的屬性ENCTYPE=”multipart/form-data” ==> form裡面的input的值以2進位制的方式傳過去.
測試,使用servlet實現http的檔案傳輸功能
總結:
1. HttpServlet提供了getParameter(arg)的方式接受字串
2. HttpServlet使用流的形式接受位元組資料,但是接收的資料相當原始,接收整個requestBody,想要獲取我們的目標資訊,我們還需要進一步處理
3. 但是,自己寫一段程式碼去處理太麻煩,懶,於是去找別人造過的輪子common-fileupload.jar;common-io.jar
//下面為程式碼實現
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
InputStream inputStream = request.getInputStream();
int len = 0;
byte[] b = new byte[1024];
while((len=inputStream.read(b))!=-1){
System.out.println(new String(b,0,len));
}
inputStream.close();
/*
------WebKitFormBoundaryr8YA5CmD7qBdF7wa
Content-Disposition: form-data; name="uploader"
guang
------WebKitFormBoundaryr8YA5CmD7qBdF7wa
Content-Disposition: form-data; name="file"; filename="筆記本.txt"
Content-Type: text/plain
# 筆記
## 2017-10-11 星期三
```
2017-10-11 星期三
```
------WebKitFormBoundaryr8YA5CmD7qBdF7wa--
* */
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
common-fileupload實現http的檔案傳輸功能
總結:
1. 竊取人家的輪子就是美滋滋;具體用法看官網http://commons.apache.org/proper/commons-fileupload/index.html照著做就行了
2. 但是我還是覺得麻煩啊,既要看文件,自己還是要寫不少的程式碼,WTF
//下面為程式碼實現
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
/*
* ServletFileUpload是common-fileupload.jar的核心類
* */
boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);
if (!isMultipartContent) {
throw new RuntimeException("your form is not multipart/form-data");
}
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File("f:\\"));
ServletFileUpload sfu = new ServletFileUpload(factory);
sfu.setHeaderEncoding("UTF-8");
try {
List<FileItem> fileItems = sfu.parseRequest(request);
for (FileItem fileitem : fileItems) {
if (fileitem.isFormField()) {
processFormField(fileitem);
} else {
processUploadField(fileitem);
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
// throw new RuntimeException("");
} catch (FileUploadBase.SizeLimitExceededException e) {
//
} catch (FileUploadException e) {
e.printStackTrace();
}
}
/**
* 處理上傳檔案
* */
private void processUploadField(FileItem fileitem) {
try {
//獲得輸入流
InputStream inputStream = fileitem.getInputStream();
String directoryRealPath = this.getServletContext().getRealPath("/WEB-INF/upload");
File storeDirectory = new File(directoryRealPath);
if (!storeDirectory.exists()) {
storeDirectory.mkdirs();
}
//獲取並重構檔名
String filename = fileitem.getName();
if (filename != null) {
filename = FilenameUtils.getName(filename);
}
filename = UUID.randomUUID() + "_" + filename;
//建立系統下的檔案以流的形式寫出
File file = new File(storeDirectory, filename);
FileOutputStream fileOutputStream = new FileOutputStream(file);
int len = 0;
byte[] b = new byte[1024];
while((len=inputStream.read(b))!=-1){
fileOutputStream.write(b, 0, len);
}
fileOutputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 處理普通表單資訊
* */
private void processFormField(FileItem fileitem) {
try {
String fieldname = fileitem.getFieldName();
String fieldvalue = fileitem.getString("UTF-8");
System.out.println(fieldname + "=" + fieldvalue);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doGet(request, response);
}
//下載檔案類似
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path = this.getServletContext().getRealPath("/WEB-INF/upload/guang.jpg");
FileInputStream fileInputStream = new FileInputStream(path);
ServletOutputStream servletOutputStream = response.getOutputStream();
String filename = path.substring(path.lastIndexOf("\\")+1);
//根據http協議,設定響應頭的屬性,告知瀏覽器接受資訊的方式即可
response.setHeader("content-disposition", "attachment;filename="+filename);
response.setHeader("content-type","img/jpeg");
int len = 0;
byte[] b = new byte[1024];
while((len=fileInputStream.read(b))!=-1){
servletOutputStream.write(b, 0, len);
}
servletOutputStream.close();
fileInputStream.close();
}
在struts2中實現檔案檔案傳輸功能
總結:
1. struts2底層使用的還是common-fileupload,in other words,struts2封裝了這個類庫,用起來更簡潔了;
2. 簡潔是簡潔了,但是程式碼格式變得呆呆的,被固定了,果然世界的真理是等價交換
3. struts2還利用了他的攔截器鏈對對上傳檔案進行了事前事後的收拾工作,
舉個栗子:限制上傳檔案的大小,限制上傳檔案的字尾名,限制上傳檔案的型別etc.等等,在struts的配置檔案中把屬性配置上就行了,
emm,大概這些功能在前端可以讓js做,但是我對js不太熟,emm,以後可以參考一些一些流行的js框架
反正別自己跑去問requestHeader就對了,能簡單搞定那還是簡單點最好
4. 檔案下載沒做優化,還是搞一個流,設定響應頭的屬性,輸出流就ok了
//下面是程式碼實現
private File photo;//上傳的檔案欄位
private String photoFileName;//上傳的檔案的檔名,固定寫法:上傳的檔案欄位+FileName
private String photoContentType;//上傳的檔案的MIME型別,固定寫法:上傳的檔案的檔名+ContentType
public String upload(){
ServletContext application = ServletActionContext.getServletContext();
String filePath = application.getRealPath("/WEB-INF/uploadFile");
File file = new File(filePath);
if(!file.exists()){
file.mkdirs();
}
photo.renameTo(new File(file,photoFileName));
return null;
}
現在比較主流的SpringMVC又是怎麼實現的呢?
總結:
1. springMVC有兩種實現,一種和struts2一樣,整合common-upload.jar;另外一種則是使用了srevlet3自帶的上傳功能
2. 使用時,需要配置對應的實現類bean(CommonsMultipartResolver/StandardServletMultipartResolver),通過容器管理,從而在系統中應用
相關推薦
http與檔案傳輸
如何實現檔案傳輸? 使用http來實現 Content-Type:application/x-www-form-urlencoded ==> 請求體為經過url編碼的字串 Content-Type:multipart/form-dat
Linux虛擬機器與主機網路連線配置與檔案傳輸
網路配置 對於VMware虛擬機器 1. 設定linux系統的網路配置,如下(NAT為預設配置,這裡採用這一配置) 2. 主機中配置本地連線-屬性-共享-勾選紅框配置項,如下: 3.重啟虛擬機器。 4.虛擬機器中終端輸入:ifconfig 檢視虛擬機器ip地址,如下
Unity 伺服器踩坑 Node.js 與 Express 資源熱更新與檔案傳輸(三)
一、下載安裝Node.js 安裝,傻瓜式點選教程 二、安裝Express 開啟cmd一步一步cd進入C:\Program Files\nodejs\node_modules\npm資料夾下 然後執行npm install --sav
imx6 usb bluetooth的連線與檔案傳輸
開發平臺:imx6dl 開發環境:yocto poky1.7(linux kernel 3.14.28) 參考文件:fsl-6dl-source/sources/meta-fsl-bsp-release/imx/meta-fsl-bluez/readme-
Netty5.0基於http協議檔案傳輸(http file)
HttpStaticFileServer.java package com.netty.demo.http.file; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.EventLoop
Qt實現客戶端與伺服器訊息傳送與檔案傳輸
客戶端與伺服器之間的資料傳送在很多案例場景裡都會有應用。這裡Jungle用Qt來簡單設計實現一個場景,即: ①兩端:伺服器QtServer和客戶端QtClient ②功能:服務端連線客戶端,兩者能夠互相傳送訊息,傳送檔案,並且顯示檔案傳送進度。 環境:VS
Struts2學習第三天——攔截器與檔案傳輸
文件版本 開發工具 測試平臺 工程名字 日期 作者 備註 V1.0 2016.06.15 lutianfei none
python基於併發與socket實現遠端檔案傳輸程式
FTP程式 Client: * bin/start.py 程式入口 * conf/配置檔案存放 * core/ * auth.py 登陸,註冊以及上傳下載檢視當前資料夾下檔案以及刪除功能存放 * cline.py 與服務端通訊 * home 本地使用者目錄 Server: * bin/
linux與windows傳輸檔案
一、使用 Xshell 工具 1. Xshell 的設定如下圖: 2. 設定 windows 共享路徑,和 linux 路徑(~ 代表跟路徑) 3. 新建檔案傳輸,點選取消或關閉 4.
FileZilla實現window10與Ubuntu之間的檔案傳輸
通過免費的FTP傳輸軟體FileZilla實現雙向傳輸,只需將該軟體下載到windows下。下載連結:https://filezilla-project.org/ 2. 使用FileZilla傳輸檔案需要SSH服務,Ubuntu作為服務端使用需要安裝SSH服務端,參考:Ubuntu下使
Linux 與Windows間檔案傳輸
從Linux伺服器下載資料夾到本地 1、使用scp命令 scp /home/work/source.txt [email protected]:/home/work/ #把本地的source.txt檔案拷貝到192.168.0.10機器上的/home/work目錄下 scp work@
linux基礎篇(五):檔案歸檔與不同系統間的檔案傳輸
檔案歸檔 檔案歸檔,就是把多個檔案變成一個歸檔檔案,即將多個檔案打包起來 tar命令 Unix和類Unix系統上的壓縮打包工具,可以將多個檔案合併為一個檔案,打包後的檔名亦為“tar”。tar檔案格式已經成為POSIX標準,最初是POSIX.1-1988,當前是POSIX.1-2
Linux、Windows連線Linux伺服器以及與伺服器傳輸檔案的方式
目前,伺服器絕大多數是Linux系統,Linux作為伺服器系統的好處在此就不多說了。本文主要說一下Linux、Windows系統下如何連線伺服器,以及向伺服器傳輸檔案。如果表達有錯誤,萬望指正。 1.Linux系統下: Linux系統下可以通過命令列介面連線伺服器以及向伺服器傳
本地電腦與遠端伺服器之間如何方便的實現檔案傳輸
對於企業辦公使用者或高校實驗室童鞋而言,經常需要在個人膝上型電腦或桌上型電腦上寫程式碼或寫文件,對於程式碼執行資源要求高的程式碼,可能還要放到實驗室的伺服器上執行。這就涉及到內網本機與遠端伺服器之間的檔案傳輸問題。實現方法有很多種,在此簡單介紹使用方便的兩種: 1、使用xftp工具
C#.網路程式設計 Socket基礎(三) 基於WinForm系統Socket TCP協議 實現端到端(伺服器與客戶端).txt.word.png等不同型別檔案傳輸
一、簡介: 前面的兩篇介紹了字串傳輸、圖片傳輸: 其實,本文針對Socket基礎(二)進一步完成,以便可以進行多種檔案傳輸。 二、基於不同的流(檔案流、記憶體流、網路等)讀寫。 1、圖片傳輸 方法一:(在客戶端用檔案流傳送(即將圖片寫到檔案流去,以便傳送),
C#.網路程式設計 Socket基礎(四) WPF系統Socket TCP協議 伺服器與客戶端 不同型別檔案傳輸,同時解決UI執行緒與工作執行緒的卡頓問題
一、簡介 雖然,本文的前面幾篇文章在WinForm中實現了Socket TCP協議 伺服器與客戶端 不同型別檔案傳輸,詳情見 但是,卻沒有在WPF中實現 Socket TCP協議 伺服器與客戶端 不同型別檔案傳輸。因此,本文將描述如何在WPF中實現該功能。
Vmware Ubuntu12.04與windows7傳輸檔案
Vmware Ubuntu12.04與windows7傳輸檔案 1.掛載時會報錯,嘗試了網上的很多對別人有用的方法,但沒用 有人說是vmtools和linux核心版本之間不相容的關係 2.看到了這篇部落格https://blog.csdn.net/YxiaoqiR/article/det
通過WinSCP工具實現Windows服務與Linux伺服器之間的檔案傳輸
2、WinSCP登入 解壓之後雙擊WinSCP.exe開啟 輸入Linux伺服器ip、埠、使用者名稱密碼進行連線 為便於下次使用,輸入完Linux伺服器資訊之後點選儲存 下次登入直接選中‘站點名稱’點選登入即可 3、WinSCP檔案傳輸 選中檔案進行
遠端桌面與本地桌面實現檔案傳輸
解決本地和遠端主機檔案複製貼上問題 在程序裡開啟rdpclip.exe程序即可在本地與伺服器間自由複製貼上; Remote Desktop Protocol 遠端桌面協議,rdpclip遠端桌面剪貼簿。 向遠端主機共享碟符 執行mstsc(Microsoft Telnet Screen Cont
windows與Linux實現檔案傳輸Winscp工具的使用
WinSCP是一個Windows環境下使用SSH的開源圖形化SFTP客戶端。同時支援SCP協議。它的主要功能就是在本地與遠端計算機間安全的複製檔案。.winscp也可以連結其他系統,比如linux系統 Winscp最大的特性是圖形化介面,能夠實現像windows一樣的拖拽功能,同時支援批量處理檔案和命令列.