最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaWeb實(shí)現(xiàn)上傳文件功能

 更新時(shí)間:2022年06月22日 11:52:36   作者:_板藍(lán)根_  
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)上傳文件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

這是需要使用到的兩個(gè)jar包一定要導(dǎo)入到lib目錄中,并添加到發(fā)布的lib目錄下

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
? <head>
? ? <title>$Title$</title>
? </head>
? <body>
? <a href="upload.jsp" rel="external nofollow" >點(diǎn)擊上傳文件</a>
? </body>
</html>

upload.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
? ? <title>上傳文件頁(yè)面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">
? ? <p>請(qǐng)輸入用戶: <input type="text" name="username"></p>
? ? <p>上傳文件: <input type="file" name="file"></p>
? ? <p><input type="submit"></p>
</form>
</body>
</html>

UpLoadServlet

package com.pzy.servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.List;
import java.util.UUID;

public class UpLoadServlet extends javax.servlet.http.HttpServlet {
? ? protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
? ? ? ? doGet(request,response);
? ? }

? ? protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
? ? ? ? try {
? ? ? ? //先判斷提交的是普通請(qǐng)求還是帶有文件的請(qǐng)求
? ? ? ? if(!ServletFileUpload.isMultipartContent(request)){
? ? ? ? ? ? return;//如果是普通文件,直接返回
? ? ? ? }//如果通過了這個(gè)if,那說明表單是帶有文件的

? ? ? ? //創(chuàng)建上傳文件的保存路徑,建議在WEB-INF下,因?yàn)檫@個(gè)文件夾是安全的,用戶是無法訪問這個(gè)文件夾的
? ? ? ? String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
? ? ? ? File uploadFile = new File(uploadPath);
? ? ? ? //判斷這個(gè)文件夾是否存在
? ? ? ? if(!uploadFile.exists()){
? ? ? ? ? ? uploadFile.mkdir();
? ? ? ? }
? ? ? ? //創(chuàng)建一個(gè)臨時(shí)路徑, 假如文件超過了預(yù)期的大小,我們就把他放在一個(gè)臨時(shí)文件下,過幾天自動(dòng)刪除,或者提醒用戶轉(zhuǎn)存為永久
? ? ? ? String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");
? ? ? ? File file = new File(tmpPath);
? ? ? ? //判斷文件夾是否存在
? ? ? ? if(!file.exists()){
? ? ? ? ? ? file.mkdir();//沒有的話就創(chuàng)建一個(gè)這樣的目錄
? ? ? ? }
? ? ? ? /*處理上傳的文件,一般都需要通過流來獲取,我們可以使用request.getInputStream(),原生態(tài)的文件上傳流獲取,十分麻煩
? ? ? ? *我們建議使用Apache的文件上傳組件來實(shí)現(xiàn),commons-fileupload,它需要依賴于common-io
? ? ? ? */
? ? ? ? //1.創(chuàng)建DiskFileItemFactory對(duì)象,處理文件上傳路徑和大小限制的;
? ? ? ? DiskFileItemFactory factory=getDiskFileItemFactory(file);
? ? ? ? //2.獲取ServletFileUpLoad
? ? ? ? ServletFileUpload upload=getServletFileUpLoad(factory);
? ? ? ? //3.處理上傳的文件

? ? ? ? String msg=uploadParseRequest(upload,request,uploadPath);

? ? ? ? //servlet請(qǐng)求轉(zhuǎn)發(fā)消息
? ? ? ? request.setAttribute("msg",msg);
? ? ? ? request.getRequestDispatcher("msg.jsp").forward(request,response);

? ? ? ? } catch (FileUploadException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }


? ? }

? ? public static ?DiskFileItemFactory getDiskFileItemFactory(File file) {
? ? ? ? DiskFileItemFactory factory = new DiskFileItemFactory();
? ? ? ? //通過這個(gè)工廠設(shè)置一個(gè)緩沖區(qū),當(dāng)上傳的文件大于這個(gè)緩沖區(qū)的時(shí)候,將他放入臨時(shí)文件中
? ? ? ? factory.setSizeThreshold(1024*1024);//此時(shí)設(shè)置緩沖區(qū)大小為1M
? ? ? ? factory.setRepository(file);//臨時(shí)目錄的保存目錄,需要一個(gè)file
? ? ? ? return factory;
? ? }

? ? public static ServletFileUpload getServletFileUpLoad(DiskFileItemFactory factory) {
? ? ? ? ServletFileUpload upload = new ServletFileUpload(factory);
? ? ? ? //監(jiān)聽文件上傳進(jìn)度
? ? ? ? upload.setProgressListener(new ProgressListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? //pBytesRead是已經(jīng)讀取的文件大小
? ? ? ? ? ? //pContentLength是文件的大小
? ? ? ? ? ? public void update(long pBytesRead, long pContentLength, int pItems) {
? ? ? ? ? ? ? ? System.out.println("總大小:"+pContentLength+"目前上傳大小:"+pBytesRead);
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? //處理亂碼問題
? ? ? ? upload.setHeaderEncoding("UTF-8");
? ? ? ? //設(shè)置單個(gè)文件的最大值
? ? ? ? upload.setFileSizeMax(1024*1024*10);//最大值為10m
? ? ? ? //設(shè)置總共文件能夠上傳的文件大小
? ? ? ? upload.setSizeMax(1024*1024*10);
? ? ? ? return upload;
? ? }
? ? public static String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String uploadPath) throws FileUploadException, IOException {
? ? ? ?String msg="";
? ? ? ? //把前端請(qǐng)求進(jìn)行解析,封裝成一個(gè)FileItem對(duì)象
? ? ? ? List<FileItem> fileItems = upload.parseRequest(request);
? ? ? ? for(FileItem fileItem:fileItems){
? ? ? ? ? ? if(fileItem.isFormField()){//判斷上傳的文件是普通的表單還是帶文件的表單
? ? ? ? ? ? ? ? //getFieldName指的是前端表單控件的name;
? ? ? ? ? ? ? ? String name = fileItem.getFieldName();
? ? ? ? ? ? ? ? String value = fileItem.getString("UTF-8");//處理亂碼
? ? ? ? ? ? ? ? System.out.println(name+":"+value);
? ? ? ? ? ? }else{//判斷它是上傳的文件

? ? ? ? ? ? ? ? //============================================處理文件=================================
? ? ? ? ? ? ? ? //拿到文件的名字
? ? ? ? ? ? ? ? String uploadFileName = fileItem.getName();
? ? ? ? ? ? ? ? System.out.println("上傳的文件名是:"+uploadFileName);
? ? ? ? ? ? ? ? if(uploadFileName.trim().equals("")||uploadFileName==null){
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //獲得上傳的文件名 ? ?(一般進(jìn)來的文件都會(huì)包含目錄.例如/image/girl/pop.png)
? ? ? ? ? ? ? ? String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
? ? ? ? ? ? ? ? //獲得后綴
? ? ? ? ? ? ? ? String fileExtName=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);
? ? ? ? ? ? ? ? /*
? ? ? ? ? ? ? ? 如果文件后綴名fileExtName不是我們需要的就直接return,不處理,告訴用戶文件類型不對(duì)
? ? ? ? ? ? ? ? ?*/
? ? ? ? ? ? ? ? System.out.println("文件信息名:"+fileName+"----文件類型"+fileExtName);
? ? ? ? ? ? ? ? //可以使用UUID(唯一識(shí)別的通用碼),保證文件名的唯一;
? ? ? ? ? ? ? ? //UUID.randomUUID(),隨機(jī)生成一個(gè)唯一識(shí)別的通用碼;
? ? ? ? ? ? ? ? String uuidPath = UUID.randomUUID().toString();
? ? ? ? ? ? ? ? //==========================文件處理完畢=====================================
? ? ? ? ? ? ? ? //存到哪? ? ? ?uploadPath
? ? ? ? ? ? ? ? //文件的真實(shí)存在路徑 ? ? realPath
? ? ? ? ? ? ? ? String realPath=uploadPath+"/"+uuidPath;
? ? ? ? ? ? ? ? //給每個(gè)文件創(chuàng)建一個(gè)對(duì)應(yīng)的文件夾
? ? ? ? ? ? ? ? File realPathFile = new File(realPath);
? ? ? ? ? ? ? ? if(!realPathFile.exists()){
? ? ? ? ? ? ? ? ? ? realPathFile.mkdir();
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //=================================存放地址完畢========================================
? ? ? ? ? ? ? ? //獲得文件上傳的流
? ? ? ? ? ? ? ? InputStream inputStream = fileItem.getInputStream();
? ? ? ? ? ? ? ? //創(chuàng)建一個(gè)文件輸出流
? ? ? ? ? ? ? ? //realPath=真實(shí)的文件夾
? ? ? ? ? ? ? ? //這只是到最后一級(jí)的目錄,還差一個(gè)文件;加上輸出文件的名字+"/"uuidFileName;
? ? ? ? ? ? ? ? FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);
? ? ? ? ? ? ? ? //創(chuàng)建一個(gè)緩沖區(qū)
? ? ? ? ? ? ? ? byte[] buffer=new byte[1024*1024];
? ? ? ? ? ? ? ? //判斷是否讀取完畢
? ? ? ? ? ? ? ? int len=0;
? ? ? ? ? ? ? ? while((len=inputStream.read(buffer))>0){
? ? ? ? ? ? ? ? ? ? fos.write(buffer,0,len);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //關(guān)閉流
? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? inputStream.close();
? ? ? ? ? ? ? ? msg="文件上傳成功!";
? ? ? ? ? ? ? ? fileItem.delete();//上傳完成,刪除臨時(shí)文件
? ? ? ? ? ? ? ? //===========================文件傳輸完成==================
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return msg;
? ? }
}

msg.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
? ? <title>消息提示</title>
</head>
<body>
${msg}
</body>
</html>

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/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
? ? ? ? ?version="4.0">
? ? <servlet>
? ? ? ? <servlet-name>UpLoadServlet</servlet-name>
? ? ? ? <servlet-class>com.pzy.servlet.UpLoadServlet</servlet-class>
? ? </servlet>
? ? <servlet-mapping>
? ? ? ? <servlet-name>UpLoadServlet</servlet-name>
? ? ? ? <url-pattern>/upload.do</url-pattern>
? ? </servlet-mapping>
</web-app>

上傳成功后,可以看到upload文件夾下存在一個(gè)有uuid碼組成的文件夾,文件夾下是我們上傳的文件

總結(jié):

1、為保證服務(wù)器安全,上傳文件應(yīng)該放在外界無法直接訪問的目錄下,比如放于WEB-INF目錄下。
2、為防止文件覆蓋的現(xiàn)象發(fā)生,要為上傳文件產(chǎn)生一個(gè)唯一的文件名,我們采用為每一個(gè)文件創(chuàng)建一個(gè)獨(dú)一無二的UUID文件夾來保存文件,即使上傳了兩個(gè)相同的文件,也要被保存在不同UUID文件名的目錄中
3、要限制上傳文件的最大值,大于最大值會(huì)被存放為臨時(shí)文件
4、由于JVM運(yùn)行的是class文件,我們的java文件被編譯為class文件是存放在web目錄中的,因此,最后的上傳地址也是在web目錄下

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

相關(guān)文章

  • 使用@Cacheable緩存解決雙冒號(hào)::的問題

    使用@Cacheable緩存解決雙冒號(hào)::的問題

    這篇文章主要介紹了使用@Cacheable緩存解決雙冒號(hào)::的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java螺旋矩陣處理方法詳解

    Java螺旋矩陣處理方法詳解

    螺旋矩陣是指一個(gè)呈螺旋狀的矩陣,它的數(shù)字由第一行開始到右邊不斷變大,向下變大,向左變大,向上變大,如此循環(huán)。利用java實(shí)現(xiàn)的螺旋矩陣,當(dāng)輸入N之后,會(huì)自動(dòng)打印出螺旋矩陣
    2022-09-09
  • Java 入門圖形用戶界面設(shè)計(jì)之事件處理上

    Java 入門圖形用戶界面設(shè)計(jì)之事件處理上

    圖形界面(簡(jiǎn)稱GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來說在視覺上更易于接受,本篇精講Java語言中關(guān)于圖形用戶界面的事件處理
    2022-02-02
  • 深度對(duì)比與解析SpringBoot中的application.properties與application.yml

    深度對(duì)比與解析SpringBoot中的application.properties與application.yml

    在Springboot項(xiàng)目中,使用.properties和.yml配置是等效的,均可以正常識(shí)別并使用,本文將為大家深入對(duì)比與解析一下二者的使用與區(qū)別,希望對(duì)大家有一定的幫助
    2025-04-04
  • SpringCloud的JPA連接PostgreSql的教程

    SpringCloud的JPA連接PostgreSql的教程

    這篇文章主要介紹了SpringCloud的JPA接入PostgreSql 教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-06-06
  • SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性)

    SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性)

    這篇文章主要介紹了SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 虛擬機(jī)linux中jdk安裝配置方法

    虛擬機(jī)linux中jdk安裝配置方法

    這篇文章主要為大家詳細(xì)介紹了虛擬機(jī)linux中jdk安裝配置方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • java多線程模擬交通燈管理系統(tǒng)

    java多線程模擬交通燈管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java多線程模擬交通燈管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java實(shí)現(xiàn)復(fù)雜的進(jìn)制轉(zhuǎn)換器功能示例

    Java實(shí)現(xiàn)復(fù)雜的進(jìn)制轉(zhuǎn)換器功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)復(fù)雜的進(jìn)制轉(zhuǎn)換器功能,結(jié)合實(shí)例形式分析了java數(shù)學(xué)運(yùn)算的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-01-01
  • 如何獲取所有spring管理的bean

    如何獲取所有spring管理的bean

    這篇文章主要介紹了如何獲取所有spring管理的bean,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

襄垣县| 太谷县| 宜州市| 达拉特旗| 邛崃市| 柳州市| 富宁县| 张家港市| 尤溪县| 江川县| 饶平县| 凤凰县| 哈巴河县| 昌宁县| 徐水县| 泌阳县| 务川| 新乐市| 浦北县| 盐津县| 集安市| 佳木斯市| 深州市| 葫芦岛市| 郧西县| 廉江市| 穆棱市| 古丈县| 平遥县| 泸西县| 石林| 彰武县| 景宁| 科尔| 巫溪县| 米林县| 安塞县| 汉阴县| 南溪县| 浠水县| 铜陵市|