欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實(shí)現(xiàn)文件上傳和下載

 更新時(shí)間:2021年10月20日 09:11:14   作者:一只Java小白1111  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java實(shí)現(xiàn)文件上傳和下載的具體代碼,供大家參考,具體內(nèi)容如下

文件的上傳

upload:文件上傳

客戶端通過表單的文件域file  把客戶端的文件 上傳保存到服務(wù)器的硬盤上

頁面

首先對上傳的表單有以下要求:

  • 必須有文件域:input type=file
  • 表單提交方式:method=post
  • 表單的 enctype=multipart/form-data
<form method="post" action="/user/regist" enctype="multipart/form-data">
        <table style="border: chartreuse;solid:2px">
            <tr>
                <th>用戶名</th>
                <td><input type="text" name="username"></td>
            </tr>
            <tr>
                <th>密碼</th>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <th>用戶頭像</th>
                <td><input type="file" name="photo"> </td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="提交"></td>
            </tr>
        </table>
</form>

Servlet

1)首先要導(dǎo)入以下兩個(gè)jar包,通過commons-fileupload實(shí)現(xiàn)文件上傳

2)創(chuàng)建一個(gè)工廠對象DiskFileItemFactory,在創(chuàng)建一個(gè)多部件表單解析器ServletFileUpload,構(gòu)造方法傳入工廠對象

3)解析器解析請求對象,獲得一個(gè)list集合,其中l(wèi)ist集合存儲的是一個(gè)一個(gè)的fileItem對象,一個(gè)fileItem對應(yīng)一個(gè)組件,也就是一個(gè)<input>

4) 遍歷集合用isFormField()方法判斷是否為普通組件,然后著重處理文件域組件

5)獲取文件名,并用getRealPath方法獲取服務(wù)器上傳文件所在路徑,創(chuàng)建新文件夾

6)獲取輸入流和創(chuàng)建輸出流,進(jìn)行文件的讀寫

@WebServlet(value = "/user/regist")
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //創(chuàng)建一個(gè)工廠對象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //創(chuàng)建一個(gè)多部件解析器對象
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        User user = new User();
        FileOutputStream out=null;
        try {
            //用解析器對象解析請求,返回一個(gè)FileItem類型的集合
            List<FileItem> list = fileUpload.parseRequest(req);
            for (FileItem fileItem : list) {
                /**
                 * fileItem.getFieldName());:::獲取組件的name值
                 * fileItem.getName());::::獲取文件域的文件名
                 * fileItem.getSize());::::獲取數(shù)據(jù)的字節(jié)個(gè)數(shù)
                 * fileItem.getString());::::獲取數(shù)據(jù)的字符串
                 * fileItem.isFormField());:::判斷是否為普通組件
                 */
                //判斷部件是否為普通組件
                if (fileItem.isFormField()) {//普通組件
                    //獲取組件名字也就是name的值
                    String fieldName = fileItem.getFieldName();
                    //獲取組件的值也就是value的值
                    String value = fileItem.getString("utf-8");
                    if ("username".equals(fieldName)) { //設(shè)置實(shí)體類的屬性
                        user.setUsername(value);
                    } else if ("password".equals(fieldName)) {
                        user.setPassword(value);
                    }
                } else {// 文件域
                    //獲取文件名
                    String fielName = fileItem.getName();
                    //輸入流來讀數(shù)據(jù)
                    InputStream in = fileItem.getInputStream();
                    //設(shè)置文件寫出的路徑,并用隨機(jī)碼來保證圖片可以重復(fù)
                    String path=req.getServletContext().getRealPath("/imgs/"+ UUID.randomUUID()+fielName);
                    System.out.println("文件路徑為:"+path);
                    File file = new File(path);
                     out = new FileOutputStream(file);
                     //利用commons-io-1.4.jar的IOUtils的copy方法直接實(shí)現(xiàn)文件的復(fù)制
                    IOUtils.copy(in,out);
                    user.setPhoto(file.getName());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(out!=null){
                out.close();
            }
        }
        req.getSession().setAttribute("user",user);
        req.getRequestDispatcher("/sucess.jsp").forward(req,resp);
    }
 
}

文件的下載

頁面

只需一個(gè)超鏈接,傳需要下載的文件名,或者直接輸入路徑在瀏覽器

例: <a  href="<c:url value='/file/download?fileName=14.jpg'/>" >狗狗1</a><br/>

Servlet

1)接收參數(shù),獲取文件名

2)獲取imgs的路徑,也就是存儲文件的文件夾的路徑,然后創(chuàng)建文件,傳入該路徑和文件名

3)創(chuàng)建輸入流讀取文件

4)設(shè)置響應(yīng)頭,首先根據(jù)文件名字獲取文件的大類型,設(shè)置響應(yīng)頭Content-Type指定響應(yīng)的類型;設(shè)置響應(yīng)頭Content-Disposition,指定文件以附件形式保存到本地磁盤

5)用響應(yīng)獲取輸出流,讀出文件到客戶端

@WebServlet("/user/download")
public class DownloadServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //獲取要下載的文件名
        String fileName = request.getParameter("fileName");
        System.out.println(fileName);
        //獲取服務(wù)器中存儲圖片的文件夾的路徑
        String path1 = request.getServletContext().getRealPath("/imgs");
        String path=path1+"/"+fileName;
        File file = new File(path);
        //創(chuàng)建輸入流讀文件
        FileInputStream in = new FileInputStream(file);
        //通過文件名字獲取文件的大類型
        String type = request.getServletContext().getMimeType(fileName);
        //設(shè)置響應(yīng)頭ContentType指定響應(yīng)內(nèi)容的類型
        response.setHeader("Content-type",type);
        //設(shè)置響應(yīng)頭Content-Disposition 指定以附件形式保存響應(yīng)的信息
        response.setHeader("Content-Disposition","attachment;filename="+(URLEncoder.encode(fileName, "utf-8")));
        ServletOutputStream out = response.getOutputStream();
        //實(shí)現(xiàn)文件的讀寫
        IOUtils.copy(in,out);
        if(in!=null){
        in.close();
        }
    }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • cookie、session和java過濾器結(jié)合實(shí)現(xiàn)登陸程序

    cookie、session和java過濾器結(jié)合實(shí)現(xiàn)登陸程序

    這篇文章主要為大家詳細(xì)介紹了cookie、session和java過濾器結(jié)合實(shí)現(xiàn)登陸程序的具體代碼,感興趣的朋友可以參考一下
    2016-05-05
  • Mybatis之collection標(biāo)簽中javaType和ofType屬性的區(qū)別說明

    Mybatis之collection標(biāo)簽中javaType和ofType屬性的區(qū)別說明

    這篇文章主要介紹了Mybatis之collection標(biāo)簽中javaType和ofType屬性的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 徹底搞懂Java多線程(五)

    徹底搞懂Java多線程(五)

    這篇文章主要給大家介紹了關(guān)于Java面試題之多線程和高并發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • SpringBoot整合MyBatis實(shí)現(xiàn)樂觀鎖和悲觀鎖的示例

    SpringBoot整合MyBatis實(shí)現(xiàn)樂觀鎖和悲觀鎖的示例

    這篇文章主要介紹了SpringBoot整合MyBatis實(shí)現(xiàn)樂觀鎖和悲觀鎖的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • spring boot 測試單元修改數(shù)據(jù)庫不成功的解決

    spring boot 測試單元修改數(shù)據(jù)庫不成功的解決

    這篇文章主要介紹了spring boot 測試單元修改數(shù)據(jù)庫不成功的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MyBatis啟動時(shí)控制臺無限輸出日志的原因及解決辦法

    MyBatis啟動時(shí)控制臺無限輸出日志的原因及解決辦法

    這篇文章主要介紹了MyBatis啟動時(shí)控制臺無限輸出日志的原因及解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 美化java代碼,從合理注釋開始

    美化java代碼,從合理注釋開始

    在Java的編寫過程中我們需要對一些程序進(jìn)行注釋,除了自己方便閱讀,更為別人更好理解自己的程序,可以是編程思路或者是程序的作用,總而言之就是方便自己他人更好的閱讀。下面我們來一起學(xué)習(xí)一下吧
    2019-06-06
  • 在Spring-Boot中如何使用@Value注解注入集合類

    在Spring-Boot中如何使用@Value注解注入集合類

    這篇文章主要介紹了在Spring-Boot中如何使用@Value注解注入集合類的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring中如何操作JDBC的實(shí)現(xiàn)

    Spring中如何操作JDBC的實(shí)現(xiàn)

    這篇文章主要介紹了Spring中如何操作JDBC的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java 實(shí)現(xiàn)簡單靜態(tài)資源Web服務(wù)器的示例

    Java 實(shí)現(xiàn)簡單靜態(tài)資源Web服務(wù)器的示例

    這篇文章主要介紹了Java 實(shí)現(xiàn)簡單靜態(tài)資源Web服務(wù)器的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11

最新評論