JavaWeb實現(xiàn)文件上傳功能詳解
文件上傳功能的實現(xiàn)
在大多數(shù)網(wǎng)站中,我們都可以看見文件上傳和下載功能的實現(xiàn),今天我們就文件上傳做一個詳細的總結(jié)
實現(xiàn)步驟:
1、新建一個JSP頁面:表單必須設(shè)置:enctype="multipart/form-data"參數(shù) upload.jsp:
<form action="" method="post" enctype="multipart/form-data"> <!--accept=".txt"標簽用來確定上傳的文件默認類型--> 請選擇您要上傳的文件:<input type="file" name="fileName" accept=".txt" ?/> <br/> 確認上傳?<input type="submit" value="確認" /><input type="reset" value="重選" /> </form>
2、編寫后端功能Servlet代碼:
UploadFile.java:
具體實現(xiàn)思路:
--------1、設(shè)置編碼方式為utf-8,獲取字符流
--------2、創(chuàng)建DiskFileItemFactory工廠類對象,將文件封裝成單獨的FileItem對象
--------3、設(shè)置文件緩存目錄
--------4、加載文件緩存目錄,創(chuàng)建ServletFileUpload對象
--------5、設(shè)置文件編碼為utf-8
--------6、解析request請求,得到上傳文件的FileItem對象,得到的也就是所有的表單name
--------7、遍歷表單name集合,判斷哪一些是普通字段和文件字段,進行區(qū)分
--------8、得到所上傳的文件路徑名
--------9、截取文件名
--------10、設(shè)置上傳的目標文件夾路徑
--------11、通過字節(jié)流進行文件的對拷
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、設(shè)置編碼方式為utf-8,獲取字符流 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter write = response.getWriter(); //2、創(chuàng)建DiskFileItemFactory工廠類對象,將文件封裝成單獨的FileItem對象 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); //3、設(shè)置文件緩存目錄 File file = new File("C:\\Cache"); ?? ??? ?if(!file.exists()) { ?? ??? ??? ?//如果文件不存在,就創(chuàng)建一個文件 ?? ??? ??? ?file.mkdirs(); ?? ??? ?} ?? ??? ?diskFileItemFactory.setRepository(file); ? ? ? ? //加載文件緩存目錄 //4、創(chuàng)建ServletFileUpload對象 ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory); //5、設(shè)置文件編碼為utf-8 fileUpload.setHeaderEncoding("utf-8"); //6、解析request請求,得到上傳文件的FileItem對象,得到的也就是所有的表單name --->比如:這里只有一個name="fileName" 拿到的就是這個集合 ?? ??? ?List<FileItem> fileItems = null; ?? ??? ?try { ?? ??? ??? ?fileItems = fileUpload.parseRequest(request); ?? ??? ?} catch (FileUploadException e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} //8、遍歷集合 for(FileItem fileItem:fileItems) { ? //文本域 //判斷是否為普通字段 ?? ??? ??? ?if(fileItem.isFormField()) { ?? ??? ??? ??? ?//得到字段名、字段值 ?? ??? ??? ??? ?String name = fileItem.getFieldName(); ? ? // ?? ??? ??? ?} ? ? //為文件域 ?? ??? ??? ?else { //9、得到所上傳的文件路徑名 String fileName = fileItem.getName(); ?//10、截取文件名? String fiString = fileName.substring(fileName.lastIndexOf("\\")+1); //11、設(shè)置上傳的目標文件夾路徑 File filedir = new File("C:\\NewFile"); ? ? ? ? if(!filedir.exists()) { ?? ??? ??? ??? ??? ?filedir.mkdir(); ?? ??? ??? ??? ?} //? ? System.out.println(user.getUserName()); ?? ??? ??? ??? ?File filepath = new File(filedir+"\\"+fiString);? //? ? System.out.println(fiString); ?? ??? ??? ??? ?if(!filepath.exists()) { ?? ??? ??? ??? ??? ?filepath.createNewFile(); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?//獲得文件上傳流 ?? ??? ??? ??? ?InputStream in = fileItem.getInputStream(); ?? ??? ??? ??? ?//使用FileOutStream打開服務(wù)器端的上傳文件 ?? ??? ??? ??? ?FileOutputStream out = new FileOutputStream(filepath); ?? ??? ??? ??? ?//流的對拷 ?? ??? ??? ??? ?byte[] bb = new byte[1024]; ?? ??? ??? ??? ?int len ;? ?? ??? ??? ??? ?while((len= in.read(bb))>0) { ?? ??? ??? ??? ??? ?out.write(bb, 0, len); //?? ??? ??? ??? ??? ?out.close(); //?? ??? ??? ??? ??? ?in.close(); ?? ??? ??? ??? ??? ?fileItem.delete(); ? //刪除臨時文件 ?? ??? ??? ??? ?} ?? ??? ??? ??? ?write.println("文件上傳成功<br/>"); ?? ??? ??? ?} ?? ??? ?} ?? ?}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實現(xiàn)等待所有子線程結(jié)束后再執(zhí)行一段代碼的方法
這篇文章主要介紹了Java實現(xiàn)等待所有子線程結(jié)束后再執(zhí)行一段代碼的方法,涉及java多線程的線程等待與執(zhí)行等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08SpringBoot配置Profile實現(xiàn)多環(huán)境支持
這篇文章主要介紹了SpringBoot配置Profile實現(xiàn)多環(huán)境支持操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java數(shù)據(jù)結(jié)構(gòu)徹底理解關(guān)于KMP算法
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)關(guān)于KMP算法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09Java游戲服務(wù)器系列之Netty相關(guān)知識總結(jié)
今天帶大家來學(xué)習(xí)Java游戲服務(wù)器的相關(guān)知識,文中對Netty作了非常詳細的介紹,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05基于logback 實現(xiàn)springboot超級詳細的日志配置
java web 下有好幾種日志框架,比如:logback,log4j,log4j2(slj4f 并不是一種日志框架,它相當于定義了規(guī)范,實現(xiàn)了這個規(guī)范的日志框架就能夠用 slj4f 調(diào)用)。這篇文章主要介紹了基于logback springboot超級詳細的日志配置,需要的朋友可以參考下2019-06-06Java靜態(tài)和非靜態(tài)成員變量初始化過程解析
這篇文章主要介紹了Java靜態(tài)和非靜態(tài)成員變量初始化過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01