js如何实现大文件上传

512 阅读1分钟

1、需要两个接口,接口a:一个接口用来确定上传内容分多少块,每块大小,上传文件内容,初始化百分比,初始化start,初始化complete:0。接口b:文件上传到后台的接口

2、创建formdata,对formdata进行分块,上传函数是$scope.customUploadFileChunkHandler

const start = config.count * config.chunkSize; // config.count:第几块,config.chunkSize:每块大小

const end = Math.min(file.size, start + config.chunkSize); // 确定上传对下一块的内容

const fileData = new FormData();

fileData.append('file', file.slice(start, end));//file是上传的文件,slice截取需要上传的块的内容

fileData.append('chunk_total', config.chunkCount);// config.chunkCount:上传文件的总块数

fileData.append('chunk_index', config.count + 1); // 上传的位置

fileData.append('upload_basename', flie.name);//上传文件的名字

3、最后通过ajax上传内容

       $.ajax({
           url: ,
           type: 'POST',
           data: fileData,
           dataType: 'json',
           success: (res) => {
               const result = res.data || {};
               if (res.rawStatusCode != 200) {
                   setTimeout(() => {
                       $scope.customUploadFileChunkHandler();
                   }, 3000);
                   return;
               }
               if (result.error != 0) {
                   return;
               }
               config.count ++;
               config.percent = result.percent;
               if (result.complete) {
                   $scope.changeOKButtonStatusToEnabled();
                   config.info = '上传完毕!';
                   config.count = 0;
                   config.complete = 1;
                   config.id = result.id;
               } else if (config.count > config.chunkCount) {
                   config.info = '上传失败,请重新上传……';
               } else {
                   setTimeout(() => {
                       $scope.customUploadFileChunkHandler();
                   }, 0);
               }
               !$scope.$$phase && $scope.$apply();
           },
           error: (XMLHttpRequest, textStatus, errorThrown) => {
               if (XMLHttpRequest.status == 0) {
                   config.info = '网络故障,正在重试……';
                   setTimeout(() => {
                       $scope.customUploadFileChunkHandler();
                   }, 3000);
               } else {
                   config.info = '发生故障,上传失败。';
                   setTimeout(() => {
                       $scope.customUploadFileChunkHandler();
                   }, 5000);
               }
           }
       });

   };