java web文件上傳與下載

2021-02-20 源碼客棧
引言

在Web應用中,由於大多數文件的上傳都是通過表單的形式提交給伺服器的,因此,要想在程序中實現文件上傳的功能,首先得創建一個用於提交上傳文件的表單頁面。

標籤的使用需要注意以下兩點:
必須要設置input輸入項的name屬性,否則瀏覽器將不會發送上傳文件的數據。
必須把將表單頁面的method屬性設置為post方式,文件的上傳是通過二進位的形式上傳數據的,enctype屬性設置為「multipart/form-data」類型

<form enctype=「multipart/form-data」 method=「post」>
         選擇上傳文件:<input type=「file」 name=「myfile」/><br />
  </form>

準備工作

開發工具:Intellij IDEA/Eclipse
所需jar包:commons-fileupload-1.*.jar和commons-io-1.4.jar
jar包下載網址:https://mvnrepository.com/
也可以通過微信公眾號源碼客棧回復 」jar"領取jar包的網盤地址下載

fileupload組件裡的一些常用的方法

我們用到的有isFormFied()、getName()、getFiedName()、write(File file) 、getString()、void delete()等

DiskFileItemFactory工廠類說明

DiskFileItemFactory類用於將請求消息實體中的每一個文件封裝成單獨的FileItem對象。如果上傳的文件比較小,將直接保存在內存中,如果上傳的文件比較大,則會以臨時文件的形式,保存在磁碟的臨時文件夾中。默認情況下,文件保存在內存還是硬碟臨時文件夾的臨界值是10240,即10kb。
DiskFileItemFactory類的兩個構造方法:

DiskFileItemFactory():採用默認臨界值和系統臨時文件夾構造文件項工廠對象
DiskFileItemFactory(int sizeThreshold,File repository):採用參數指定臨界值和系統臨時文件夾構造文件項工廠對象

ServletFileUpload():構造一個未初始化的ServletFileUpload實例對象

ServletFileUpload(FileItemFactory fileItemFactory):根據參數指定的FileItemFactory 對象創建一個ServletFileUpload對象
ServletFileUpload類是Apache組件處理文件上傳的核心高級類,通過使用parseRequest(HttpServletRequest) 方法可以將HTML中每個表單提交的數據封裝成一個FileItem對象,然後以List列表的形式返回。

文件下載

對於文件下載,人們並不陌生,我們經常會在某網站下載圖片,下載電影等等。
實現文件下載功能比較簡單,直接使用Servlet類和輸入/輸出流即可實現。實現文件的下載,不僅需要指定文件的路徑,還需要在HTTP協議中設置兩個響應消息頭:

//設定接受程序處理數據的方式
Content-Disposition:attachment; filename =
//設定試題內容的MIME類型
Content-Type:application/x-msdownload

瀏覽器通常會直接處理響應的實體內容。當我們需要在HTTP響應消息中設置這兩個響應消息頭欄位,來指定接收程序處理數據內容的方式為下載方式,當單擊「下載」超連結時,系統將請求提交到對應的Servlet。在該Servlet中,首先獲取下載文件的地址,並根據該地址創建文件字節輸入流,然後通過該流讀取下載文件內容,最後將讀取的內容通過輸出流寫到目標文件中。

項目骨架

創建實體類

我們通過實體類來暫時保存表單裡面的value值和文件的路徑

private String username;

 private String photo;

 //setter和getter方法

@Override

    public String toString() {

        return "User{" +

                "username='" + username + '\'' +

                ", photo='" + photo + '\'' +

                '}';

   }

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"  version="4.0">

    <servlet>

        <servlet-name>UploadServlet</servlet-name>

        <servlet-class>edu.ymkz.web.UploadServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>UploadServlet</servlet-name>

        <url-pattern>/UploadServlet</url-pattern>

    </servlet-mapping>

    <servlet>

        <servlet-name>DownloadServlet</servlet-name>

        <servlet-class>edu.ymkz.web.DownloadServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>DownloadServlet</servlet-name>

        <url-pattern>/DownloadServlet</url-pattern>

    </servlet-mapping>

</web-app>

上傳文件 fileupload.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>Title</title>

</head>

<body>

<form enctype="multipart/form-data" action="/UploadServlet" method="post">

    用戶名:<input type="text" name="username"><br>

   頭像:<input type="file" name="photo"><br>

    <input type="submit" value="提交">

</form>

</body>

</html>

UploadServlet(處理下載請求)

package edu.ymkz.web;

import edu.ymkz.entity.User;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileItemFactory;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;

import javax.servlet.ServletInputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.File;

import java.io.IOException;

import java.util.List;

public class UploadServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       doPost(req,resp);//調用doPost方法

    }

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");//處理亂碼

        String path="D:\\Program Files\\JetBrains\\idea_projects\\java web\\file_upload\\web\\file\\";

        //默認的文件保存路徑,也就是項目的工程所在位置

     //先判斷是否是多段的數據,如果返回true,表示普通的表單項,false為文件

        if(ServletFileUpload.isMultipartContent(req)){

            FileItemFactory fileItemFactory=new DiskFileItemFactory();//創建本地文件系統

            ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);

            try {

                List<FileItem> list=servletFileUpload.parseRequest(req);//解析多段數據

                User user=new User();

               for(FileItem fileItem:list){

                    if(fileItem.isFormField()){//普通表單項

                        user.setUsername(fileItem.getString("utf-8"));//保存普通表但的值

                        System.out.println("表單項的name值"+fileItem.getFieldName());

                        System.out.println("表單項的value值"+fileItem.getString("utf-8"));//解決亂碼

                    }else{//文件

                     user.setPhoto(path+fileItem.getName());//把圖片的路徑保存起來

                        System.out.println("表單項的name值"+fileItem.getFieldName());

                        System.out.println("表單項的value值"+fileItem.getName());//解決亂碼

                        fileItem.write(new File(path+fileItem.getName()));

                    }

  }

                System.out.println(user.toString());//列印出保存的value值

            }catch (Exception e){

                e.printStackTrace();

            }

        }

    }

}

UploadServlet列印結果

文件下載 download.jsp

若圖片上傳之後不顯示,請刪除項目裡的out目錄然後重新部署,就可以了.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>Title</title>

</head>

<body>

   <img src="/file/ymkz.jpg" /><br>

   <a href="/DownloadServlet?filename=源碼客棧.jpg">下載</a>

</body>

</html>

文件下載DownloadServet

超連結時doGet方法,當請求傳到doGet方法之後再調用doPost方法

package edu.ymkz.web;

import org.apache.commons.io.IOUtils;

import sun.misc.BASE64Encoder;

import javax.servlet.*;

import javax.servlet.annotation.WebServlet;

import javax.servlet.descriptor.JspConfigDescriptor;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.UnsupportedEncodingException;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLEncoder;

import java.util.Enumeration;

import java.util.EventListener;

import java.util.Map;

import java.util.Set;

@WebServlet(name = "DownloadServlet")

public class DownloadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String downloadFileName = request.getParameter("filename");

        System.out.println(downloadFileName);

        ServletContext servletContext = getServletContext();

        String mimeType = servletContext.getMimeType("/file/" + downloadFileName);

        System.out.println("下載的文件類型" + mimeType);

        response.setContentType(mimeType);

        //attachment表示附件,filename是文件名,表示用來下載的文件名

        if (request.getHeader("User-Agent").contains("Firefox")) {

            response.setHeader("Content-Disposition", "attachment;filename=?UTF-8?B?" + new BASE64Encoder().encode(downloadFileName.getBytes("UTF-8")) + "?=");

        } else {//處理下載之後文件名 為亂碼,針對ie google等瀏覽器

            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadFileName, "utf-8"));

        }

        //火狐,谷歌兼容性最好

        InputStream inputStream = servletContext.getResourceAsStream("/file/" + downloadFileName);

        byte[] bytes = new byte[1024];

        OutputStream outputStream = response.getOutputStream();

        IOUtils.copy(inputStream, outputStream);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doPost(request, response);

    }

}

本程序源碼案例下載網盤地址

連結:https://pan.baidu.com/s/1skoWj9c9bm0Ue-aCZGS35w

提取碼:7f6f

若網盤連接失效,公眾號窗口留言即可

相關焦點

  • SpringMVC文件上傳下載
    文件上傳和下載是網際網路web應用非常重要的組成部分,它是信息交互傳輸的重要渠道之一。你可能經常在網頁上傳下載文件,你可能也曾沉浸於網際網路技術的神秘,而本篇就為你解開它神秘的面紗。本文已收錄在博學谷已教程的方式進行,閱讀原文即可觀看。案例分析你肯定會問:通過本篇可能能夠學到什麼?
  • SpringBoot實現文件上傳、下載到伺服器
    從入門到精通實戰課程分享一、SpringBoot模擬文件上傳,下載上傳:文件前端傳入,後端獲取到文件通過輸出流寫入文件下載:獲取到文件路徑,通過輸入流讀取,在通過輸出流寫入文件實現下載#文件上傳大小配置 單個文件大小 總的文件大小spring.servlet.multipart.max-file-size
  • Java Web-分頁原理及實現
    web.xml:在實際使用之前,需要先下載Commons-FileUpload的JAR文件(下載地址http://commons.apache.org/proper/commons-fileupload/)。此外,因為文件上傳必然會涉及文件的讀寫操作,所以還需要下載Commons-IO的JAR文件(下載地址http://commons.apache.org/proper/commons-io/)。
  • Springboot+Vue實現上傳文件顯示進度條效果功能
    上傳文件過程中頁面文件上傳成功頁面 文件上傳成功路勁;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile
  • jquery uploadify和apache Fileupload實現異步上傳文件示例
    Uploadify + Apache Fileupload異步上傳文件示例1、可以限制上傳文件大小和類型,理論上任何類型的文件都可以上傳(自己根據api配置即可);2、後臺使用Apache commons-fileupload-1.3.1.jar作為上傳工具包,本示例支持一次性多文件上傳;3、文件上傳目錄可以任意指定,請在web.xml中配置;Uploadify api
  • 【Java Web開發教程】Java Web開發精講高清視頻教程免費下載
    今天給大家帶來Java Web開發精講高清視頻教程免費下載Java Web,是用Java技術來解決相關web網際網路領域的技術總和。web包括:web伺服器和web客戶端兩部分。Java在客戶端的應用有java applet,不過使用得很少,Java在伺服器端的應用非常的豐富,比如Servlet,JSP和第三方框架等等。Java技術對Web領域的發展注入了強大的動力。文件大小:1.86G
  • 原創 | 淺談Springboot中的文件上傳
    在JavaWeb應用中,任意文件上傳一直是關注的重點,攻擊者通過上傳惡意jsp文件,可以獲取伺服器權限。
  • 文件上傳下載就用這個,還可以在線看電影!
    對於我們普通用戶來說,這個軟體可以實現文件上傳下載,手機在線看電影, 亦可拍攝視頻照片後自動上傳分享與其它用戶。支持 Windows、Linux、甚至 OpenWrt 路由器平臺。永恆君認為這款軟體的亮點功能有三個:1.上傳下載;2.支持直接播放音樂和視頻 3.帶訪問權限控制。
  • Spring Boot(十七):使用 Spring Boot 上傳文件
    上傳文件是網際網路中常常應用的場景之一,最典型的情況就是上傳頭像等,今天就帶著帶著大家做一個 Spring Boot 上傳文件的小案例。1、pom 包配置我們使用 Spring Boot 版本 2.1.0、jdk 1.8、tomcat 8.0。
  • javaWeb中,如何通過Commons-FileUpload組件上傳文件
    》前言:文件上傳大家都不陌生,在這個網際網路飛速發展的時代,共享資源已經是常態了,用戶將自己計算機中的文件上傳至伺服器端供別人下載、瀏覽,已經是web項目中最常用的功能了。比如在QQ空間中我們上傳的照片,在博客中我們上傳的工具插件,均離不開文件上傳,那麼,今天我們就來看看,javaweb中,是如何實現文件上傳的?
  • 學Unity的貓之文件上傳下載續傳(十四)
    有些較大的文件下載需要斷點續傳的功能(即下載了一部分突然中斷下載後,再次下載直接從上次下載的地方繼續下載,而不是重新下載),就需要使用HttpWebRequest或UnityWebRequest。uploadProgressfloat表示從伺服器上傳數據的進度isDonebool是否完成與遠程伺服器的通信14.5 案例講解14.5.1 本地文件讀取要將本地文件上傳到web伺服器,需要先以字節流的方式讀取本地文件。
  • 使用HttpClient實現文件的上傳下載
    一般的情況下我們都是使用Chrome或者其他瀏覽器來訪問一個WEB伺服器,用來瀏覽頁面查看信息或者提交一些數據、文件上傳下載等等。所訪問的這些頁面有的僅僅是一些普通的頁面,有的需要用戶登錄後方可使用,或者需要認證以及是一些通過加密方式傳輸,例如HTTPS。目前我們使用的瀏覽器處理這些情況都不會構成問題。但是一旦我們有需求不通過瀏覽器來訪問伺服器的資源呢?那該怎麼辦呢?
  • Springboot+Vue實現批量文件上傳(pdf、word、excel)並支持在線預覽功能
    java.io.FileOutputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Value
  • Spring Boot 整合 Web 開發
    這一節我們主要學習如何整合 Web 相關技術:ServletFilterListener訪問靜態資源文件上傳文件下載  Web三大基本組件分別是:Servlet,Listener,Filter。文件上傳  Spring MVC 通過 MultipartResolver(多部件解析器)對象實現對文件上傳的支持。
  • Java Web安全 || Java基礎 · Java IO/NIO多種讀寫文件方式
    收錄於話題 #webvoid main(String[] args) throws IOException { // 定義寫入文件路徑 File file = new File("/tmp/1.txt"); // 定義待寫入文件內容 String content = "Hello World."
  • 文件上傳與下載
    文件上傳與下載一、文件的上傳要有一個form標籤,method=post請求
  • 從零淺析漏洞:文件讀取與下載漏洞
    利用思路下載常規的配置文件,例如: ssh,weblogic,ftp,mysql等相關配置下載各種.log文件,從中尋找一些後臺地址,文件上傳點之類的地方一些常見利用方式java+oracle環境可以先下載/WEB-INF/classes/applicationContext.xml 文件,這裡面記載的是web伺服器的相應配置,然後下載/WEB-INF/classes/xxx/xxx/aaa.class
  • SpringBoot + Vue 實現文件的上傳與下載
    前言簡要地記錄下 SpringBoot 與 Vue 實現文件的上傳與下載2.fileName=` + this.form.fileName    }   }  }) </script></html>前臺頁面:上傳:可以上傳多個文件,最多5個,但每次只能上傳一個文件,需要上傳多次。
  • Java Web安全 || Java 文件系統 · Java FileSystem
    Java抽象出了一個叫做文件系統的對象:java.io.FileSystem,不同的作業系統有不一樣的文件系統,例如Windows和Unix就是兩種不一樣的文件系統: java.io.UnixFileSystem、java.io.WinNTFileSystem。
  • 文件上傳總結
    0x00文件上傳的原理以及危害:網站web