1. 程式人生 > >http與檔案傳輸

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/

linuxwindows傳輸檔案

一、使用 Xshell 工具 1. Xshell 的設定如下圖: 2. 設定 windows 共享路徑,和 linux 路徑(~ 代表跟路徑) 3. 新建檔案傳輸,點選取消或關閉 4.

FileZilla實現window10Ubuntu之間的檔案傳輸

通過免費的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.04windows7傳輸檔案

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

windowsLinux實現檔案傳輸Winscp工具的使用

WinSCP是一個Windows環境下使用SSH的開源圖形化SFTP客戶端。同時支援SCP協議。它的主要功能就是在本地與遠端計算機間安全的複製檔案。.winscp也可以連結其他系統,比如linux系統 Winscp最大的特性是圖形化介面,能夠實現像windows一樣的拖拽功能,同時支援批量處理檔案和命令列.