日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA文件传输原理及介绍—狂神说

發布時間:2023/12/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA文件传输原理及介绍—狂神说 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JAVA文件傳輸原理及介紹

1.搭建環境




2.配置Tomcat以及下載jar包

common-io以及common-fileupload包

Maven Repository: commons-fileupload ? commons-fileupload (mvnrepository.com)

Maven Repository: commons-io ? commons-io (mvnrepository.com)

3. 文件上傳原理

4.上傳文件調優

5.需要用到的類

ServletFileUpload負責處理上傳的文件數據,并將表單中每個輸入項封裝成一個FileItem對象,在使用ServletFileUpload對象解析請求時需要DiskFileItemFactory對象。所以哦,我們需要在進行解析工作前構造好DiskFileItemFactory對象,通過ServletFileUpload對象的構造方法或ServletFileItemFactory()方法設置ServletFileUpload對象的fileItemFactory屬性

FileItem類

在HTML頁面input必須有name < input type=“file” name=“filename” >

表單如果包含一個文件上傳輸入項的話,這個表單的enctype屬性就必須設置為multipart/form-date

<form action="" method="post" enctype="multipart/form-data">上傳用戶: <input type="text" name="username"><br><p><input type="file" name="file1"></p><p><input type="file" name="file2"></p><p><input type="submit"> | <input type="reset"></p> </form>

瀏覽器表單的類型如果為multipart/form-data,在服務器端想獲取數據就要通過流。

【常用方法介紹】

//isFormField方法用于判斷FileItem類對象封裝的數據是一個普通文本表單還是一個文件表單,如果是普通文本表單字段則返回true,否則返回false boolean isFormField();//getFieldName方法用于返回表單標簽name屬性的值 String getFieldName(); //getString方法用于將FileItem對象中保存的數據流內容以一個字符串返回 String getString();//getName方法用于獲得文件上傳字段中的文件名 String getName();//以流的形式返回上傳文件的內容數據 InputStream getInputStream();//delete方法用來清空FileItem類對象中存放的主體內容,如果主體內容唄保存在臨時文件中,delete方法將刪除該臨時文件 void delete();

ServletFileUploda類

ServletFileUploda負責處理上傳的文件數據,并將表單中每個輸入項封裝成一個FileItem對象中,使用其parseRequest(HttpservletRequest)方法可以將通過表單中每一個HTML標簽提交的數據封裝成一個FileItem對象,然后以List列表的形式返回。使用該方法處理上傳文件簡答易用。

6.代碼編寫

UploadFileServlet

package com.wang.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.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.UUID;public class FileServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//判斷上傳的文件是普通表單還是帶文件的表單if (!ServletFileUpload.isMultipartContent(request)){return;//終止方法運行,說明這是一個普通的表單,直接返回}//創建上傳文件的保存路徑,建議在WEB-INF路徑下,安全,用戶無法直接訪問上傳的文件;String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");File uploadFile = new File(uploadPath);if (uploadFile.exists()){//.exists()取反uploadFile.mkdir();//創建這個目錄}//緩存,臨時文件//臨時路徑,加入文件超過了預期的大小,我們就把它放到一個臨時文件中,過幾天自動刪除,或者提醒用戶轉存為永久String tmpPath = this.getServletContext().getRealPath("/WEB-INF/upload");File file = new File(tmpPath);if (file.exists()){//.exists()取反file.mkdir();//創建這個臨時目錄}// 處理上傳的文件,一般都需要通過流來獲取,我們可以使用request.getInputstream(),原生態的文件上傳流獲取,十分麻煩// 但是我們都建議使用 Apache的文件上傳組件來實現, common-fileupload,它需要依賴于commons-io組件;try {// 創建DiskFileItemFactory對象,處理文件路徑或者大小限制DiskFileItemFactory factory = getDiskFileItemFactory(file);/** //通過這個工廠設置一個緩沖區,當上傳的文件大于這個緩沖區的時候,將他放到臨時文件 factory.setSizeThreshold(1024 ** 1024); //緩存區大小為1M factory.setRepository (file);//臨時目錄的保存目錄,需要一個File*/// 2、獲取ServletFileUploadServletFileUpload upload = getServletFileUpload(factory);// 3、處理上傳文件// 把前端請求解析,封裝成FileItem對象,需要從ServletFileUpload對象中獲取String msg = uploadParseRequest(upload, request, uploadPath);// Servlet請求轉發消息System.out.println(msg);if(msg.equals("文件上傳成功!")) {// Servlet請求轉發消息request.setAttribute("msg",msg);request.getRequestDispatcher("info.jsp").forward(request, response);}else {msg ="請上傳文件";request.setAttribute("msg",msg);request.getRequestDispatcher("info.jsp").forward(request, response);}} catch (FileUploadException e) {e.printStackTrace();}}public static DiskFileItemFactory getDiskFileItemFactory(File file) {DiskFileItemFactory factory = new DiskFileItemFactory();// 通過這個工廠設置一個緩沖區,當上傳的文件大于這個緩沖區的時候,將他放到臨時文件中;factory.setSizeThreshold(1024 * 1024);// 緩沖區大小為1Mfactory.setRepository(file);// 臨時目錄的保存目錄,需要一個filereturn factory;}public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {ServletFileUpload upload = new ServletFileUpload(factory);// 監聽上傳進度upload.setProgressListener(new ProgressListener() {// pBYtesRead:已讀取到的文件大小// pContextLength:文件大小public void update(long pBytesRead, long pContentLength, int pItems) {System.out.println("總大小:" + pContentLength + "已上傳:" + pBytesRead);}});// 處理亂碼問題upload.setHeaderEncoding("UTF-8");// 設置單個文件的最大值upload.setFileSizeMax(1024 * 1024 * 10);// 設置總共能夠上傳文件的大小// 1024 = 1kb * 1024 = 1M * 10 = 10мreturn upload;}public static String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String uploadPath)throws FileUploadException, IOException {String msg = "";// 把前端請求解析,封裝成FileItem對象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;}// 獲得上傳的文件名/images/girl/paojie.pngString fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);// 獲得文件的后綴名String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);/** 如果文件后綴名fileExtName不是我們所需要的 就直按return.不處理,告訴用戶文件類型不對。*/System.out.println("文件信息[件名: " + fileName + " ---文件類型" + fileExtName + "]");// 可以使用UID(唯一識別的通用碼),保證文件名唯// 0UID. randomUUID(),隨機生一個唯一識別的通用碼;String uuidPath = UUID.randomUUID().toString();// ================處理文件完畢==============// 存到哪? uploadPath// 文件真實存在的路徑realPathString realPath = uploadPath + "/" + uuidPath;// 給每個文件創建一個對應的文件夾File realPathFile = new File(realPath);if (!realPathFile.exists()) {realPathFile.mkdir();}// ==============存放地址完畢==============// 獲得文件上傳的流InputStream inputStream = fileItem.getInputStream();// 創建一個文件輸出流// realPath =真實的文件夾;// 差了一個文件;加上翰出文件的名產"/"+uuidFileNameFileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);System.out.println("path:"+realPath + "/" + fileName);// 創建一個緩沖區byte[] buffer = new byte[1024 * 1024];// 判斷是否讀取完畢int len = 0;// 如果大于0說明還存在數據;while ((len = inputStream.read(buffer)) > 0) {fos.write(buffer, 0, len);}// 關閉流fos.close();inputStream.close();msg = "文件上傳成功!";fileItem.delete(); // 上傳成功,清除臨時文件//=============文件傳輸完成=============}}return msg;} }

編寫info.jsp

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

配置xml

<servlet><servlet-name>FileServlet</servlet-name><servlet-class>com.wang.servlet.FileServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>FileServlet</servlet-name><url-pattern>/upload.do</url-pattern> </servlet-mapping>

總結

以上是生活随笔為你收集整理的JAVA文件传输原理及介绍—狂神说的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。