整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Java實例:Vue前端與Java后端實現大文件異步

          Java實例:Vue前端與Java后端實現大文件異步上傳下載功能

          我們項目開發中,大文件上傳與下載是一項常見的功能需求,特別是在高并發和用戶體驗要求高的場景下。Vue.js作為一款流行的前端框架,以其響應式的數據綁定和組件化的優勢使得前端交互更加流暢;而Java后端憑借其穩定性和高性能,是構建健壯服務端的理想選擇。

          老規矩,多余話不說,直接上實現思路與代碼。

          大文件異步上傳功能實現思路:

          前端:

          1. 使用HTML5的FormData API封裝文件信息,可通過new FormData()并將file對象添加到表單數據中。
          2. 利用axios或其他HTTP庫發送POST請求,設置請求頭Content-Type為'multipart/form-data'以適應文件上傳。
          3. 實現進度條功能,通過監聽xhr.upload.onprogress事件實時更新上傳進度。

          后端:

          1. 接收multipart請求,使用如Commons FileUpload或Spring Boot自帶的MultipartFile接口解析文件。
          2. 文件暫存于臨時目錄或直接上傳至云存儲服務,如OSS或S3。
          3. 后端處理完成后返回相應狀態碼和信息,以便前端顯示上傳結果。

          大文件異步下載功能實現思路:

          前端:

          1. 前端通過點擊事件觸發下載動作,向后端發送請求獲取文件下載鏈接或者流式響應。
          2. 對于較大的文件,可以創建隱藏的iframe或者a標簽配合download屬性,由服務器返回合適的Content-Disposition頭來觸發瀏覽器下載。

          后端:

          1. 根據請求生成文件下載的響應,設置適當的Content-Type和Content-Disposition頭部信息。
          2. 若采用流式傳輸,可使用Servlet的OutputStream逐塊讀取文件并發送給客戶端,減輕內存壓力。

          思路有了,直接上代碼:

          前端Vue部分(使用axios):

          前端Vue部分,我們將創建一個簡單的上傳組件,該組件包括一個文件輸入框和一個進度條,用于展示上傳進度。這里假設你已經設置了axios,并全局導入。

          <!-- Vue組件 -->
          <template>
            <div>
              <input type="file" @change="handleFileSelect" />
              <div v-if="uploadProgress > 0">
                上傳進度: {{ uploadProgress }}%
                <progress :value="uploadProgress" max="100"></progress>
              </div>
            </div>
          </template>
          
          <script>
          export default {
            data() {
              return {
                uploadProgress: 0,
                selectedFile: null,
              };
            },
            methods: {
              handleFileSelect(event) {
                this.selectedFile=event.target.files[0];
          
                let formData=new FormData();
                formData.append('file', this.selectedFile);
          
                axios.post('/api/upload', formData, {
                  headers: {
                    'Content-Type': 'multipart/form-data'
                  },
                  onUploadProgress: (progressEvent)=> {
                    this.uploadProgress=Math.round((progressEvent.loaded * 100) / progressEvent.total);
                  }
                })
                .then(response=> {
                  console.log('File uploaded successfully:', response.data);
                  // 清除上傳進度并重置文件選擇
                  this.uploadProgress=0;
                  this.selectedFile=null;
                })
                .catch(error=> {
                  console.error('Error uploading file:', error);
                  this.uploadProgress=0;
                });
              },
            },
          };
          </script>
          // Vue組件內方法
          async handleFileUpload(file) {
            const formData=new FormData();
            formData.append('file', file); // 'file' 是從<input type="file">元素獲取的文件對象
          
            const config={
              headers: {
                'Content-Type': 'multipart/form-data'
              },
              onUploadProgress: progressEvent=> {
                this.progress=Math.round((progressEvent.loaded * 100) / progressEvent.total);
              }
            };
          
            try {
              const response=await axios.post('/api/upload', formData, config);
              console.log(response.data); // 處理后端返回的信息
            } catch (error) {
              console.error(error);
            }
          }

          后端Java Spring Boot部分(接收文件):

          import org.springframework.web.multipart.MultipartFile;
          import org.springframework.web.bind.annotation.PostMapping;
          import org.springframework.web.bind.annotation.RequestParam;
          import org.springframework.http.ResponseEntity;
          
          @RestController
          public class FileController {
          
              @PostMapping("/api/upload")
              public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
                  if (file.isEmpty()) {
                      return ResponseEntity.badRequest().body("Failed to upload, no file content found.");
                  }
          
                  // 獲取文件名及擴展名
                  String originalFilename=file.getOriginalFilename();
          
                  // 將文件保存到指定路徑,這里僅為示例,生產環境中需要考慮磁盤空間、文件命名策略等問題
                  try {
                      Path path=Paths.get(UPLOADED_FOLDER_PATH + originalFilename);
                      Files.write(path, file.getBytes());
                      return ResponseEntity.ok("File uploaded successfully");
                  } catch (IOException e) {
                      return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                                         .body("Failed to upload the file: " + e.getMessage());
                  }
              }
          }

          對于大文件下載,通常后端會提供一個下載鏈接,前端接收到此鏈接后,可以通過創建隱藏的<a>標簽模擬點擊下載,或者利用Blob對象在瀏覽器中創建可下載的URL。后端可能提供的不是一個鏈接,而是直接返回帶有正確Content-Disposition頭的響應體,觸發瀏覽器下載行為。

          后端Java Spring Boot部分(提供文件下載):

          import org.springframework.core.io.Resource;
          import org.springframework.http.HttpHeaders;
          import org.springframework.http.ResponseEntity;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.PathVariable;
          import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
          
          import javax.servlet.http.HttpServletResponse;
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.IOException;
          
          @GetMapping("/api/download/{filename}")
          public ResponseEntity<StreamingResponseBody> downloadFile(@PathVariable String filename) throws IOException {
              // 這里假設已知文件存放的實際路徑
              File file=new File(DOWNLOAD_FOLDER_PATH + filename);
          
              if (!file.exists()) {
                  return ResponseEntity.notFound().build();
              }
          
              StreamingResponseBody stream=outputStream -> {
                  FileInputStream fis=new FileInputStream(file);
                  byte[] buffer=new byte[4096];
                  int n;
                  while ((n=fis.read(buffer)) !=-1) {
                      outputStream.write(buffer, 0, n);
                  }
                  fis.close();
              };
          
              HttpHeaders headers=new HttpHeaders();
              headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");
          
              return ResponseEntity.ok()
                                   .headers(headers)
                                   .contentType(MediaType.APPLICATION_OCTET_STREAM)
                                   .body(stream);
          }

          在這個例子中,當用戶選擇文件后,handleFileSelect方法會被調用,開始上傳文件。通過監聽onUploadProgress事件,我們可以獲取到文件上傳的進度,并實時更新到視圖層展示給用戶。上傳完成后,清除上傳進度,并允許用戶再次選擇文件進行上傳。如果在上傳過程中發生錯誤,也會捕獲異常并顯示錯誤信息。

          思路和代碼都說完,簡單說幾句,以上結合Vue前端技術和Java后端技術,我們成功地搭建了一套高效可靠的大文件異步上傳下載解決方案。前端通過良好的用戶界面提供了直觀的上傳下載進度反饋,而后端則確保了數據的高效處理與安全傳輸。這套方案不僅適用于一般企業級應用,也能應對大數據處理的復雜場景。當然,在實際部署和應用中還需注意權限控制、錯誤處理以及性能優化等方面,以保證系統的整體穩定性與用戶體驗。

          如果有用,請點贊+關注!

          ava+超大文件上傳與下載,java+超大文件上傳與下載解決方案,java+超大文件上傳與下載思路,java+超大文件上傳與下載實例,java+超大文件上傳與下載源碼,java+超大文件分塊上傳與下載,java+超大文件分片上傳與下載,java+超大文件切片上傳與下載,


          java大文件10G,50G,100G上傳下載,JSP大文件10G,50G,100G上傳下載,JAVA大文件10G,50G,100G上傳下載,斷點續傳。

          一般這么大的文件不用HTML的一次性上傳,而是采用分塊,分片,分段,分割,切割技術上傳。

          JAVA話一般是負責后端的邏輯,比如文件初始化,文件塊上傳,合并,存儲等。

          前端的話用JSP,VUE2,VUE3,React,HTML5,JS,JQ都行。這個都無所謂。

          痛點就是刷新繼續,批量上傳,批量下載。網上能夠做到批量下載,文件夾下載的,搜了一下,幾乎沒有,全部都是講的上傳,基本上都是用的HTML5的API,也就是Chrome的API,關鍵是這個API不支持IE。在政府單位用不了。還有一些企業也不用了。

          網上一般的做法都是用的HTML5的API,也就是chrome提供的API,能夠滿足基本需求,但是還是有痛點,chrome限制死了,固定死了無法擴展,每個域名只允許5個TCP連接,導致了速度有上限,你也無法修改和擴展。然后就是瀏覽器也只能用chrome,用戶用了IE就不行了,用戶現有的系統跑在IE上,也不能換。

          進度信息容易丟失,用戶關閉網頁,刷新網頁,關閉瀏覽器,重啟瀏覽器,關閉電腦,重啟電腦后,進度信息都會丟失,無解,沒辦法。擴展性還是差了點。

          下載,網上找到的資料一般都是講上傳的,很少講下載的。

          斷點續傳,就是在文件上傳的過程中發生了中斷,人為因素(暫停)或者不可抗力(斷網或者網絡差)導致了文件上傳到一半失敗了。然后在環境恢復的時候,重新上傳該文件,而不至于是從新開始上傳的。

          斷點續傳的功能是基于分塊上傳來實現的,把一個大文件分成很多個小塊,服務端能夠把每個上傳成功的分塊都落地下來,客戶端在上傳文件開始時調用接口快速驗證,條件選擇跳過某個分塊。

          實現原理,就是在每個文件上傳前,就獲取到文件MD5取值,在上傳文件前調用接口,如果獲取的文件狀態是未完成,則返回所有的還沒上傳的分塊的編號,然后前端進行條件篩算出哪些沒上傳的分塊,然后進行上傳。

          當接收到文件塊后就可以直接寫入到服務器的文件中。


          導入項目:
          導入到Eclipse:
          http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
          導入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
          springboot統一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2



          下載示例:

          https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/




          工程



          NOSQL

          NOSQL示例不需要任何配置,可以直接訪問測試



          創建數據表

          選擇對應的數據表腳本,這里以SQL為例




          修改數據庫連接信息


          訪問頁面進行測試



          文件存儲路徑

          up6/upload/年/月/日/guid/filename






          相關問題:
          1.javax.servlet.http.HttpServlet錯誤
          2.項目無法發布到tomcat
          3.md5計算完畢后卡住
          4.服務器找不到config.json文件

          相關參考:

          文件保存位置


          源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

          源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl



          OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

          產品源代碼:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
          授權生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1

          HTML5實現分片上傳GB級大文件組件,用HTML實現分片上傳GB級大文件組件,用javascript實現分片上傳GB級大文件組件,用js實現分片上傳GB級大文件組件,用vue2實現分片上傳GB級大文件組件,用vue3實現分片上傳GB級大文件組件,用HTML5實現分片上傳1GB級大文件組件,用HTML5實現分片上傳5GB級大文件組件,用HTML5實現分片上傳10GB級大文件組件,用HTML5實現分片上傳50GB級大文件組件,用HTML5實現分片上傳100GB級大文件組件,用HTML5實現分塊上傳GB級大文件組件,用HTML5實現分段上傳GB級大文件組件,用HTML5實現分割上傳GB級大文件組件,用HTML5實現切割上傳GB級大文件組件,用HTML5實現分片上傳GB級大文件控件,用HTML5實現分片上傳GB級大文件技術,用HTML5實現分片上傳GB級大文件方案,用HTML5實現分片上傳GB級大文件教程,

          1.下載示例

          https://gitee.com/xproer/up6-vue-cli



          將up6組件復制到項目中

          示例中已經包含此目錄



          1.引入up6組件



          2.配置接口地址

          接口地址分別對應:文件初始化,文件數據上傳,文件進度,文件上傳完畢,文件刪除,文件夾初始化,文件夾刪除,文件列表

          參考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de



          3.處理事件



          啟動測試



          啟動成功



          效果



          數據庫


          主站蜘蛛池模板: 久久se精品一区精品二区国产| 无码日韩精品一区二区人妻 | 国精无码欧精品亚洲一区| 精品国产一区二区三区免费| 秋霞鲁丝片一区二区三区| 亚洲高清一区二区三区| 亚洲av无码一区二区三区不卡| 一区三区三区不卡| 国产一区二区在线视频播放| 中文字幕一区二区三匹| 色欲AV蜜臀一区二区三区| 岛国精品一区免费视频在线观看| 国产一区二区三区视频在线观看| 日韩高清一区二区| 日本一区二区三区日本免费| 亚洲熟妇成人精品一区| 毛片一区二区三区| 糖心vlog精品一区二区三区| 国产精品视频一区麻豆| 无码中文人妻在线一区二区三区| 久久精品免费一区二区| 中文字幕一区二区三区人妻少妇| 亚洲男女一区二区三区| 亚洲综合一区国产精品| 国产精品99精品一区二区三区| 亚洲中文字幕久久久一区| 国产情侣一区二区| 在线视频一区二区日韩国产| 一区二区三区无码高清视频| 日本在线视频一区| 国产一区二区女内射| 久久精品视频一区二区三区| 无码人妻精品一区二区三| 亚洲天堂一区二区三区| 国产成人精品一区二区A片带套| 国产激情一区二区三区在线观看 | 精品一区二区三区在线视频| 国产爆乳无码一区二区麻豆| 日本激情一区二区三区| 精品国产亚洲一区二区三区在线观看 | 狠狠色综合一区二区|