精华内容
下载资源
问答
  • 在系统的开发过程中,经常会有上传大容量视频的需求,而大容量视频的上传则会花费很长时间,在一定程度上需要用户等待很久,用户体验不佳,为此有开发秒传功能的需要,本文章实现秒传的原理是在执行上传之前先检查...

    1、应用场景和实现原理

    在系统的开发过程中,经常会有上传大容量视频的需求,而大容量视频的上传则会花费很长时间,在一定程度上需要用户等待很久,用户体验不佳,为此有开发秒传功能的需要,本文章实现秒传的原理是在执行上传之前先检查之前是否已经上传过,若上传过则不再重复上传,直接返回该视频存放在服务器的URL,若没有上传过则进行上传。

    那么如何判断该视频是否已经上传过是本文章的重点,采取的是通过文件的MD5进行判断(同一视频文件的MD5值是相同的)

    2、代码实现

    readFileMD5 = (file) => {
        // 读取视频文件的md5
        console.log("获取文件的MD5值")
        let fileRederInstance = new FileReader()
        fileRederInstance.readAsBinaryString(file)
        fileRederInstance.addEventListener('load', e => {
          let fileBolb = e.target.result
          fileMD5 = md5(fileBolb)
         //是否已经上传的网络请求
          uploadCheckAxios({ "md5": fileMD5 }).then(res => {
            if (res.data.code == 0) {
              console.log("文件已被上传")
            }
            else { 
              console.log("文件未被上传,将分片上传")
            }
          }).catch((e) => {
            console.log(e)
          })
        })
      }

     

    展开全文
  • 文件名称: STM32F429_IAP下载 收藏√ [5 4 3 2 1]所属分类: SCM开发工具: Windows_Unix文件大小: 8367 KB上传时间: 2015-03-31下载次数: 2提 供 者: goby详细说明:基于STM cotrexM4处理器的iap应用串口在线下载工程...

    文件名称: STM32F429_IAP891ea1e7dab975064c6bfd22796603ae.gif下载

      收藏√  [443d104427974206832dc4b12407db70.gif

     5  4  3  2  1 fb9128a58cbeaabbeb3718ed75079ccf.gif]

    所属分类: SCM

    开发工具: Windows_Unix

    文件大小: 8367 KB

    上传时间: 2015-03-31

    下载次数: 2

    提 供 者: goby

    详细说明:基于STM cotrexM4处理器的iap应用串口在线下载工程,实现开机延时等待,超时运行程序,输入特殊字符执行IAP在线下载-Processor-based STM cotrexM4 iap application serial download engineering, and boot delay waiting for the timeout to run the program, enter special characters perform IAP online download

    文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):

    STM32F429_IAP\Libraries\CMSIS\CMSIS END USER LICENCE AGREEMENT.pdf

    .............\.........\.....\Device\ST\STM32F4xx\Include\stm32f4xx.h

    .............\.........\.....\......\..\.........\.......\system_stm32f4xx.h

    .............\.........\.....\......\..\.........\Release_Notes.html

    .............\.........\.....\......\..\.........\Source\Templates\arm\startup_stm32f4xx.s

    .............\.........\.....\......\..\.........\......\.........\gcc_ride7\startup_stm32f4xx.s

    .............\.........\.....\......\..\.........\......\.........\iar\startup_stm32f4xx.s

    .............\.........\.....\......\..\.........\......\.........\system_stm32f4xx.c

    .............\.........\.....\......\..\.........\......\.........\TASKING\cstart_thumb2.asm

    .............\.........\.....\......\..\.........\......\.........\.rueSTUDIO\startup_stm32f4xx.s

    .............\.........\.....\.ocumentation\CMSIS-SVD_Schema_1_0.xsd

    .............\.........\.....\.............\CMSIS_CM4_SIMD.htm

    .............\.........\.....\.............\CMSIS_Core.htm

    .............\.........\.....\.............\CMSIS_DebugSupport.htm

    .............\.........\.....\.............\CMSIS_History.htm

    .............\.........\.....\.............\CMSIS_Logo_Final.jpg

    .............\.........\.....\.............\CMSIS_System_View_Description.htm

    .............\.........\.....\Include\arm_common_tables.h

    .............\.........\.....\.......\arm_math.h

    .............\.........\.....\.......\core_cm0.h

    .............\.........\.....\.......\core_cm3.h

    .............\.........\.....\.......\core_cm4.h

    .............\.........\.....\.......\core_cm4_simd.h

    .............\.........\.....\.......\core_cmFunc.h

    .............\.........\.....\.......\core_cmInstr.h

    .............\.........\.....\index.htm

    .............\.........\.....\README.txt

    .............\.........\STM32F4xx_StdPeriph_Driver\inc\misc.h

    .............\.........\..........................\...\stm32f4xx_adc.h

    .............\.........\..........................\...\stm32f4xx_can.h

    .............\.........\..........................\...\stm32f4xx_crc.h

    .............\.........\..........................\...\stm32f4xx_cryp.h

    .............\.........\..........................\...\stm32f4xx_dac.h

    .............\.........\..........................\...\stm32f4xx_dbgmcu.h

    .............\.........\..........................\...\stm32f4xx_dcmi.h

    .............\.........\..........................\...\stm32f4xx_dma.h

    .............\.........\..........................\...\stm32f4xx_exti.h

    .............\.........\..........................\...\stm32f4xx_flash.h

    .............\.........\..........................\...\stm32f4xx_fsmc.h

    .............\.........\..........................\...\stm32f4xx_gpio.h

    .............\.........\..........................\...\stm32f4xx_hash.h

    .............\.........\..........................\...\stm32f4xx_i2c.h

    .............\.........\..........................\...\stm32f4xx_iwdg.h

    .............\.........\..........................\...\stm32f4xx_pwr.h

    .............\.........\..........................\...\stm32f4xx_rcc.h

    .............\.........\..........................\...\stm32f4xx_rng.h

    .............\.........\..........................\...\stm32f4xx_rtc.h

    .............\.........\..........................\...\stm32f4xx_sdio.h

    .............\.........\..........................\...\stm32f4xx_spi.h

    .............\.........\..........................\...\stm32f4xx_syscfg.h

    .............\.........\..........................\...\stm32f4xx_tim.h

    .............\.........\..........................\...\stm32f4xx_usart.h

    .............\.........\..........................\...\stm32f4xx_wwdg.h

    .............\.........\..........................\Release_Notes.html

    .............\.........\..........................\src\misc.c

    .............\.........\..........................\...\stm32f4xx_adc.c

    .............\.........\..........................\...\stm32f4xx_can.c

    .............\.........\..........................\...\stm32f4xx_crc.c

    .............\.........\..........................\...\stm32f4xx_cryp.c

    .............\.........\..........................\...\stm32f4xx_cryp_aes.c

    .............\.........\..........................\...\stm32f4xx_cryp_des.c

    .............\.........\..........................\...\stm32f4xx_cryp_tdes.c

    .............\.........\..........................\...\stm32f4xx_dac.c

    .............\.........\..........................\...\stm32f4xx_dbgmcu.c

    .............\.........\..........................\...\stm32f4xx_dcmi.c

    .............\.........\..........................\...\stm32f4xx_dma.c

    .............\.........\..........................\...\stm32f4xx_exti.c

    .............\.........\..........................\...\stm32f4xx_flash.c

    .............\.........\..........................\...\stm32f4xx_fsmc.c

    .............\.........\..........................\...\stm32f4xx_gpio.c

    .............\.........\..........................\...\stm32f4xx_hash.c

    .............\.........\..........................\...\stm32f4xx_hash_md5.c

    .............\.........\..........................\...\stm32f4xx_hash_sha1.c

    .............\.........\..........................\...\stm32f4xx_i2c.c

    .............\.........\..........................\...\stm32f4xx_iwdg.c

    .............\.........\..........................\...\stm32f4xx_pwr.c

    .............\.........\..........................\...\stm32f4xx_rcc.c

    .............\.........\..........................\...\stm32f4xx_rng.c

    .............\.........\..........................\...\stm32f4xx_rtc.c

    .............\.........\..........................\...\stm32f4xx_sdio.c

    .............\.........\..........................\...\stm32f4xx_spi.c

    .............\.........\..........................\...\stm32f4xx_syscfg.c

    .............\.........\..........................\...\stm32f4xx_tim.c

    .............\.........\..........................\...\stm32f4xx_usart.c

    .............\.........\..........................\...\stm32f4xx_wwdg.c

    .............\Project\STM32F4xx_IAP\binary_template\Binary\arm-elf-objcopy.exe

    .............\.......\.............\...............\......\axftobin.bat

    .............\.......\.............\...............\......\cygwin1.dll

    .............\.......\.............\...............\......\hex2bin.exe

    .............\.......\.............\...............\......\RIDE7_hextobin.bat

    .............\.......\.............\...............\......\STM324xG_EVAL_SysTick.bin

    .............\.......\.............\...............\......\TASKING_hextobin.bat

    .............\.......\.............\...............\......\TrueSTUDIO_elf2bin.bat

    .............\.......\.............\...............\EWARM\Project.ewd

    .............\.......\.............\...............\.....\Project.ewp

    .............\.......\.............\...............\.....\Project.eww

    .............\.......\.............\...............\.....\stm32f4xx_flash_offset.icf

    .............\.......\.............\...............\inc\main.h

    .............\.......\.............\...............\...\stm32f4xx_conf.h

    .............\.......\.............\...............\...\stm32f4xx_it.h

    输入关键字,在本站238万海量源码库中尽情搜索:

    帮助

    [MATLAB_Program.zip] - 图像处理的一些经典算法,包含level-set,C_V,GAC等模型的代码

    [Matlab.zip] - 关于matlab仿真通讯系统的文章,主要是一些基本的概念,对初学者特别有用,能纠正模糊不清的概念

    [STM32F4x7_ETH_IAP_V1.0.0.rar] - lwip移植到stm32上面,希望对初学者有帮助,我也是初学者,通过这个代码对他们有个了解

    [SYS_conf.zip] - STM32F407时钟,中断配置头文件,该文件包含HSE,HSI,LSE,LSI,I2S,MCO时钟的初始化;

    PLL时钟配置,PLL,SYSCLK,HCLK,PCLK1,PCLK2时钟的配置;

    RCC,GPIO,EXIT,NVIC的配置;

    展开全文
  • 整体思路 第一步是结合项目背景,调研比较优化的解决方案。文件上传失败是老生常谈的问题,常用方案是将一个大文件切片成多个小文件,并行请求接口进行...MD5 是文件的唯一标识,可以利用文件的 MD5 查询文件的上传

    整体思路

    第一步是结合项目背景,调研比较优化的解决方案。文件上传失败是老生常谈的问题,常用方案是将一个大文件切片成多个小文件,并行请求接口进行上传,所有请求得到响应后,在服务器端合并所有的分片文件。当分片上传失败,可以在重新上传时进行判断,只上传上次失败的部分,减少用户的等待时间,缓解服务器压力。这就是分片上传文件。

    大文件上传

    那么如何实现大文件分片上传呢?

    流程图如下:

    image

    大文件上传流程图

    分为以下步骤实现:

    1. 文件 MD5 加密—

    MD5 是文件的唯一标识,可以利用文件的 MD5 查询文件的上传状态。

    根据文件的修改时间、文件名称、最后修改时间等信息,通过 spark-md5[2] 生成文件的 MD5。需要注意的是,大规格文件需要分片读取文件,将读取的文件内容添加到 spark-md5[3] 的 hash 计算中,直到文件读取完毕,最后返回最终的 hash 码到 callback 回调函数里面。这里可以根据需要添加文件读取的进度条。

    image

    MD5 加密过程

    实现方法如下:

    // 修改时间+文件名称+最后修改时间-->MD5
    md5File (file) {
      return new Promise((resolve, reject) => {
        let blobSlice =
          File.prototype.slice ||
          File.prototype.mozSlice ||
          File.prototype.webkitSlice
        let chunkSize = file.size / 100
        let chunks = 100
        let currentChunk = 0
        let spark = new SparkMD5.ArrayBuffer()
        let fileReader = new FileReader()
        fileReader.onload = function (e) {
          console.log('read chunk nr', currentChunk + 1, 'of', chunks)
          spark.append(e.target.result) // Append array buffer
          currentChunk++
          if (currentChunk < chunks) {
            loadNext()
          } else {
            let cur = +new Date()
            console.log('finished loading')
            // alert(spark.end() + '---' + (cur - pre)); // Compute hash
            let result = spark.end()
            resolve(result)
          }
        }
        fileReader.onerror = function (err) {
          console.warn('oops, something went wrong.')
          reject(err)
        }
        function loadNext () {
          let start = currentChunk * chunkSize
          let end =
            start + chunkSize >= file.size ? file.size : start + chunkSize
          fileReader.readAsArrayBuffer(blobSlice.call(file, start, end))
        }
        loadNext()
      })
    }
    

    2. 查询文件状态—

    前端得到文件的 MD5 后,从后台查询是否存在名称为 MD5 的文件夹,如果存在,列出文件夹下所有文件,得到已上传的切片列表,如果不存在,则已上传的切片列表为空。image

    // 校验文件的MD5
    checkFileMD5 (file, fileName, fileMd5Value, onError) {
      const fileSize = file.size
      const { chunkSize, uploadProgress } = this
      this.chunks = Math.ceil(fileSize / chunkSize)
      return new Promise(async (resolve, reject) => {
        const params = {
          fileName: fileName,
          fileMd5Value: fileMd5Value,
        }
        const { ok, data } = await services.checkFile(params)
        if (ok) {
          this.hasUploaded = data.chunkList.length
          uploadProgress(file)
          resolve(data)
        } else {
          reject(ok)
          onError()
        }
      })
    }
    

    3. 文件分片—

    文件上传优化的核心就是文件分片,Blob 对象中的 slice 方法可以对文件进行切割,File 对象是继承 Blob 对象的,因此 File 对象也有 slice 方法。

    定义每一个分片文件的大小变量为 chunkSize,通过文件大小 FileSize 和分片大小 chunkSize 得到分片数量 chunks,使用 for 循环和 file.slice() 方法对文件进行分片,序号为 0 - n,和已上传的切片列表做比对,得到所有未上传的分片,push 到请求列表 requestList。

    image

    文件分片
    async checkAndUploadChunk (file, fileMd5Value, chunkList) {
      let { chunks, upload } = this
      const requestList = []
      for (let i = 0; i < chunks; i++) {
        let exit = chunkList.indexOf(i + '') > -1
        // 如果已经存在, 则不用再上传当前块
        if (!exit) {
          requestList.push(upload(i, fileMd5Value, file))
        }
      }
      console.log({ requestList })
      const result =
        requestList.length > 0
          ? await Promise.all(requestList)
            .then(result => {
              console.log({ result })
              return result.every(i => i.ok)
            })
            .catch(err => {
              return err
            })
          : true
      console.log({ result })
      return result === true
    }
    

    4. 上传分片—

    调用 Promise.all 并发上传所有的切片,将切片序号、切片文件、文件 MD5 传给后台。

    后台接收到上传请求后,首先查看名称为文件 MD5 的文件夹是否存在,不存在则创建文件夹,然后通过 fs-extra 的 rename 方法,将切片从临时路径移动切片文件夹中,结果如下:

    image

    上传分片

    当全部分片上传成功,通知服务端进行合并,当有一个分片上传失败时,提示“上传失败”。在重新上传时,通过文件 MD5 得到文件的上传状态,当服务器已经有该 MD5 对应的切片时,代表该切片已经上传过,无需再次上传,当服务器找不到该 MD5 对应的切片时,代表该切片需要上传,用户只需上传这部分切片,就可以完整上传整个文件,这就是文件的断点续传。

    image

    断点续传示意图
    // 上传chunk
    upload (i, fileMd5Value, file) {
      const { uploadProgress, chunks } = this
      return new Promise((resolve, reject) => {
        let { chunkSize } = this
        // 构造一个表单,FormData是HTML5新增的
        let end =
          (i + 1) * chunkSize >= file.size ? file.size : (i + 1) * chunkSize
        let form = new FormData()
        form.append('data', file.slice(i * chunkSize, end)) // file对象的slice方法用于切出文件的一部分
        form.append('total', chunks) // 总片数
        form.append('index', i) // 当前是第几片
        form.append('fileMd5Value', fileMd5Value)
        services
          .uploadLarge(form)
          .then(data => {
            if (data.ok) {
              this.hasUploaded++
              uploadProgress(file)
            }
            console.log({ data })
            resolve(data)
          })
          .catch(err => {
            reject(err)
          })
      })
    }
    

    5. 上传进度—

    虽然分片批量上传比大文件单次上传会快很多,也还是有一段加载时间,这时应该加上上传进度的提示,实时显示文件上传进度。

    原生 Javascript 的 XMLHttpRequest 有提供 progress 事件,这个事件会返回文件已上传的大小和总大小。项目使用 axios[4] 对 ajax 进行封装,可以在 config 中增加 onUploadProgress 方法,监听文件上传进度。

    image

    上传进度
    const config = {
      onUploadProgress: progressEvent => {
        var complete = (progressEvent.loaded / progressEvent.total * 100 | 0) + '%'
      }
    }
    services.uploadChunk(form, config)
    

    6. 合并分片—

    上传完所有文件分片后,前端主动通知服务端进行合并,服务端接受到这个请求时主动合并切片,通过文件 MD5 在服务器的文件上传路径中找到同名文件夹。从上文可知,文件分片是按照分片序号命名的,而分片上传接口是异步的,无法保证服务器接收到的切片是按照请求顺序拼接。所以应该在合并文件夹里的分片文件前,根据文件名进行排序,然后再通过 concat-files 合并分片文件,得到用户上传的文件。至此大文件上传就完成了。

    image

    merge

    image

    合并分片示意图

    Node 端代码:

    // 合并文件
    exports.merge = {
      validate: {
        query: {
          fileName: Joi.string()
            .trim()
            .required()
            .description('文件名称'),
          md5: Joi.string()
            .trim()
            .required()
            .description('文件md5'),
          size: Joi.string()
            .trim()
            .required()
            .description('文件大小'),
        },
      },
      permission: {
        roles: ['user'],
      },
      async handler (ctx) {
        const { fileName, md5, size } = ctx.request.query
        let { name, base: filename, ext } = path.parse(fileName)
        const newFileName = randomFilename(name, ext)
        await mergeFiles(path.join(uploadDir, md5), uploadDir, newFileName, size)
          .then(async () => {
            const file = {
              key: newFileName,
              name: filename,
              mime_type: mime.getType(`${uploadDir}/${newFileName}`),
              ext,
              path: `${uploadDir}/${newFileName}`,
              provider: 'oss',
              size,
              owner: ctx.state.user.id,
            }
            const key = encodeURIComponent(file.key)
              .replace(/%/g, '')
              .slice(-100)
            file.url = await uploadLocalFileToOss(file.path, key)
            file.url = getFileUrl(file)
            const f = await File.create(omit(file, 'path'))
            const files = []
            files.push(f)
            ctx.body = invokeMap(files, 'toJSON')
          })
          .catch(() => {
            throw Boom.badData('大文件分片合并失败,请稍候重试~')
          })
      },
    }
    

    总结

    本文讲述了大规格文件上传优化的一些做法,总结为以下 4 点:

    1. Blob.slice 将文件切片,并发上传多个切片,所有切片上传后告知服务器合并,实现大文件分片上传;
    2. 原生 XMLHttpRequest 的 onprogress 对切片上传进度的监听,实时获取文件上传进度;
    3. spark-md5 根据文件内容算出文件 MD5,得到文件唯一标识,与文件上传状态绑定;
    4. 分片上传前通过文件 MD5 查询已上传切片列表,上传时只上传未上传过的切片,实现断点续传。

    参照 Demo 源码[5] 可快速上手上述功能,希望本文能对你有所帮助,感谢阅读 ❤️

    服务推荐

    展开全文
  • webuploader上传控件

    2018-10-13 23:10:39
    webuploader在同一个页面中有多个实例时,如果将如下代码放到实例中,事件beforeSendFile会执行多次。...做md5验证 // WebUploader会等待此异步操作完成后,开始发送文件。 WebUploader.Uploader.registe...

    webuploader开源魔改

    开源地址:https://github.com/luoyunchong/staticfiles/blob/master/libs/abp.webuploader.js

    参考

    文件上传

    示例,使用方式,用户下载 staticfiles项目后,使用vscode打开项目,安装live server插件,可将前端项目运行起来,进入tests/webuploader-file.html 页面 ,可展示出具体效果。依赖于后端,暂未整理。

              $(function () {
                //实例化文件上传,webuploader的属性都可以使用
                $("#uploadfile").powerWebUpload({
                    // fileNumLimit: 2,
                    // auto: false
                });
                //编辑时编辑值
                webuploader.loadFile({
                    elem: '#uploadfile',
                    rows: [{
                        Id: 1,
                        FileName: '-1d2fab5b7544b288.jpg',
                        FileToken: '9a92df63-24fc-4592-968c-efcf70cea290.jpg',
                        FileSize: '2333'
                    }]
                });
                //查看页面,只需要调用 这个方法即可,isCheck为true时为查看页面,没有删除按钮
                webuploader.loadFile({
                    elem: '#check',
                    isCheck:true,
                    rows: [{
                        Id: 1,
                        FileName: '-1d2fab5b7544b288.jpg',
                        FileToken: '9a92df63-24fc-4592-968c-efcf70cea290.jpg',
                        FileSize: '2333'
                    }]
                });
            });
            //如何获取上传文件的地址  ,多文件上传时,文件名最后以*分割     9a92df63-24fc-4592-968c-efcf70cea290.jpg*9a92df63-24fc-4592-968c-efcf70cea290.jpg  
            function getFiles() {
                var data = $("#uploadfile").GetFilesAddress();
                return data;
            }
        </script>
    
        <form class="form-horizontal">
            <label for="" class="">附件:</label>
            <div id="uploadfile" style="position: relative"></div>
            <br />
            <label for="" class="">查看页面:</label>
            <div id="check"></div>
        </form>
    
    

    图片上传

    可参考这个页面:https://github.com/luoyunchong/staticfiles/blob/master/tests/webuploader-img.html
    即设置属性 uploadType:'img’即可。

    遇到的问题

    webuploader在同一个页面中有多个实例时,如果将如下代码放到实例中,事件beforeSendFile会执行多次。但如果只实例一次,无法在验证秒传文件后,得到当前上传文件实例

    // 大文件分片,断点续传,以及秒传功能
    // 在文件开始发送前做些异步操作。做md5验证
    // WebUploader会等待此异步操作完成后,开始发送文件。
    WebUploader.Uploader.register({
        "before-send-file": "beforeSendFile"
    }, {
        beforeSendFile: function (file) {
            var task = new $.Deferred();
            var $fileId = file.id;
            uploader.md5File(file, 0, 10 * 1024 * 1024).progress(function (percentage) {
                var uploadflieElement = $('#' + fileId);
                if (opts.uploadType === 'file') {
                    var value = Math.round(percentage * 100);
                    uploadflieElement.find('div.webuploadstate .webupload-text').html('正在上传' + value + '%');
                }
            }).then(function (val) {
                var $fileId = file.id;
                userInfo.md5 = val;
                $.ajax({
                    headers: {
                        "Authorization": "Bearer " + webuploader.authorization
                    },
                    type: "POST",
                    url: serviceUrl + '/File/Md5Validate',
                    data: {
                        md5: val
                    },
                    cache: false,
                    timeout: 3000,
                    dataType: "json"
                }).then(function (response, textStatus, jqXHR) {
                    //若存在,这返回失败给WebUploader,(后台操作)表明该文件不需要上传,然后就可以把数据库查询出的文件信息的物理路径给新文件
                    if (response.success == true) {
                        //task.reject('秒传成功');  此处会执行uploadError
                        uploader.skipFile(file);
                        //上传成功事件
                        if (opts.uploadType === 'file') {
                            if($('#'+$fileId+' .webuploadstate .file-token').attr('data-filetoken')!=''){
                                return;
                            }
                            var limit = webuploader.bytesToSize(file.size);
                            var downUrl = serviceUrl + '/File/Download?fileToken=' + response.result + '&newName=' + file.name;
    
                            $('#' + $fileId).find('div.webuploadstate .webupload-text').html(limit + ' 秒传');
                            $('#' + $fileId).find('div.webuploadstate .file-token').attr('data-filetoken', response.result);
    
                            $('#' + $fileId)
                                .find('div.webuploadinfo .webupload-button a')
                                .after('<a href="' + downUrl + '" target="_blank"><span  class="webupload-download">下载</span></a>');
    
                        } else {
                            window.setTimeout(function () {
                                $('#' + $fileId + ' img').attr('src', serviceUrl + '/File/Download?fileToken=' + response.result);
                                $('#' + $fileId + ' .webupload-list-img-cover .img-upload-state span.file-token').attr('data-filetoken', response.result);
                            }, 500);
                        }
                    }
                    task.resolve();
                }, function (jqXHR, textStatus, errorThrown) { //任何形式的验证失败,都触发重新上传
                    task.resolve();
                });
            });
    
            return $.when(task);
        }
    });
    

    如果解决此问题呢?

    1. 在方法外定义一个对象,存储当前uploader实例,uploaders[userInfo.index]即可访问到当前实例
        var userInfo = {
                md5: '',
                index: ''
            },
            uploaders = {};
    
    1. 在before-send-file事件前执行此方法,即监听beforeFileQueued方法
        
            /*当文件被加入队列之前触发,此事件的handler返回值为false,则此文件不会被添加进入队列。*/
            uploader.on("beforeFileQueued",
                function (file) {
                    //
                    userInfo.index = pickerid;
                    return true;
                });
    

    ·

    展开全文
  • 前端流程图image.png主要技术点切片利用 Blob.prototype.slice 切片获取切片md5 作为唯一标识具体代码// 计算切片数量 const page = Math.ceil(file.size / size); // 初始位置 let start = 0; // 等待的异步任务...
  • 获取切片md5 作为唯一标识 具体代码 // 计算切片数量 const page = Math.ceil(file.size / size); // 初始位置 let start = 0; // 等待的异步任务队列 const promiseList = []; for (let i = 0; i < page; i++) ...
  • 前端流程图image.png主要技术点切片利用 Blob.prototype.slice 切片获取切片md5 作为唯一标识具体代码// 计算切片数量 const page = Math.ceil(file.size / size); // 初始位置 let start = 0; // 等待的异步任务...
  • 广数980系统锁解除密码

    千次阅读 2020-05-13 20:33:07
    第一步是结合项目背景,调研比较优化的解决方案。 文件上传失败是老生常谈的问题,常用方案是将一个大文件切片成多个...MD5 是文件的唯一标识,可以利用文件的 MD5 查询文件的上传状态。 根据文件的修改时间、文件名称
  • 断点续传

    2021-04-05 16:00:34
    server import socketserver import struct import hashlib import os import json class Mysocket(socketserver.BaseRequestHandler): “”"" ...等待客户端发送md5值 验证通过后发送上传结果到客户端
  • ap1g1-k9w7-tar.153-3.JK.tar

    2020-02-18 16:51:34
    MD5: 2075f0900bf7d508a3a232b345e02fa0 思科CAP702I,CAP703W,胖AP固件,ap1g1-k9w7-tar.153-3.JK.tar 刷胖方法: 1、PC设置IP:10.0.0.2/255.0.0.0 2、固件放放TFTP目录 3、连consle线进入CLI监视 4、...
  •  * md5(自设密码+$ace) //$ace为cdn镜像地址 使用方法:  * 1.确认 $pwd 变量值为 false, 上传本文件到PHP空间并访问  * 2.第一次访问提示设置密码,设置密码并牢记  * 3.使用第一次设置的密码登录后,默认编辑的是...
  • 密码加密方式:* md5(自设密码+$ace) //$ace为cdn镜像地址使用方法:* 1.确认 $pwd 变量值为 false, 上传本文件到PHP空间并访问* 2.第一次访问提示设置密码,设置密码并牢记* 3.使用第一次设置的密码登录后,默认编辑的...
  • 在线“制作”MD5:https://tool.chinaz.com/tools/md5.aspx 3. 听歌次数 注意:播放次数不建议设置太大,可以先设置几十试试。 4. 初衷 这款软件的开发初衷是为了帮助使用过网易云音乐自动升级的用户,在系统推送...
  • 这是我的毕业设计 我没翻译直接上传所以是英文的 这个是手机销售系统;...密码是使用MD5加密再存入数据库的;每一天数据库都会自动备份方便管理,高阶使用者可以恢复一个星期以内的数据库;原始密码为adminadmin
  • 4:密码md5加密 5:后台登陆验证码识别 6:后台美化 7:新站登陆验证码识别 8:网站参数设置:网站名称,网站地址,站长邮箱等 9:无需修改任何网页,安装更为简单 10:网站信息后台设置 11:优化后台管理 ...
  • MD5String 计算一个字符串的MD5效验和 CRC32File 计算一个文件的CRC32效验和 CRC32String 计算一个字符串的CRC32效验和 des 采用DES算法加密或解密一个字符串,长度为8位 des16 采用DES算法加密或解密一个...
  • 字符串操作工具类(ToolString.java),生成UUID、非空非NULL逻辑判断、生成MD5等常用共通方法 数据操作工具类(ToolData.java),自动递归获取表单数据封装成Map、本地数据分页共通方法等 图片操作工具类...
  • <code class="language-python">#coding:utf-8 ''' @author: ZainCheung @LastEditors: ZainCheung @description:网易云音乐全自动每日打卡云函数版 @... str(text) &...
  • 字符串操作工具类(ToolString.java),生成UUID、非空非NULL逻辑判断、生成MD5等常用共通方法 数据操作工具类(ToolData.java),自动递归获取表单数据封装成Map、本地数据分页共通方法等 图片操作工具类...
  • 字符串操作工具类(ToolString.java),生成UUID、非空非NULL逻辑判断、生成MD5等常用共通方法 数据操作工具类(ToolData.java),自动递归获取表单数据封装成Map、本地数据分页共通方法等 图片操作工具类...
  • 包括了离线包的版本、状态、以及文件的 url 地址和 md5 值等。 当 <a href="https://github.com/mcuking/mobile-web-best-practice">mobile-web-best-practice</a> 更新后,会通过 ...
  • cloudpan189-go rapidupload -size=56276137 -md5=fbe082d80e90f90f0fb1f94adbbcfa7f /test/file.txt 创建目录 cloudpan189-go mkdir <目录> 例子 cloudpan189-go mkdir test123 删除文件/目录 cloudpan189...
  • 运行以上命令后就转换至新的数据格式,但是即使转换了,可能部分有中文名的文件同步过了,系统还会认为没有同步,因为Perl语言支持的UTF8中文需要开启标志位,这就导致在获取路径名的md5码与bash版的不同,要是数据...
  • github release增加MD5校验,若发现MD5值和release包计算得出的不一致,请勿使用,网盘会一直放在那。 部分版本因为工作原因可能无法及时更新,请自行打包(一般ES小版本迭代不会有大的改动,只需要更改版本号即可,...
  • 3、**网盘取文件信息()0、md5 1、创建时间 2、修改时间 3、访问时间 4、文件大小。 [2020-2-8-2] ================ 1、**修复向c盘写:HPSocket4C.dll,已经解决,解决办法是 通用对话框组件下面属性:不改变目录...
  • 5章 复杂查询技术 5.1 使用子查询 实例113 将子查询作为表达式 实例114 用子查询作为派生表 实例115 通过子查询关联数据 实例116 使用IN谓词限定查询范围 实例117 使用NOT IN子查询实现差集运算 实例118 使用NOT ...
  • Java开发实战1200例.第2卷.part3

    热门讨论 2013-05-08 22:46:34
    实例002 CSS改变XML中鼠标指针形状 5 实例003 CSS在XML中添加背景图 7 实例004 CSS制作XML表格 8 实例005 XML中的提取节点字符串值 10 实例006 在XML内部定义DTD 12 实例007 在XML外部引用DTD 14 实例008 验证XML...
  • Java开发实战1200例.第2卷.part2

    热门讨论 2013-05-08 22:45:35
    实例002 CSS改变XML中鼠标指针形状 5 实例003 CSS在XML中添加背景图 7 实例004 CSS制作XML表格 8 实例005 XML中的提取节点字符串值 10 实例006 在XML内部定义DTD 12 实例007 在XML外部引用DTD 14 实例008 验证XML...
  • Java开发实战1200例.第2卷.part1

    热门讨论 2013-05-08 22:44:13
    实例002 CSS改变XML中鼠标指针形状 5 实例003 CSS在XML中添加背景图 7 实例004 CSS制作XML表格 8 实例005 XML中的提取节点字符串值 10 实例006 在XML内部定义DTD 12 实例007 在XML外部引用DTD 14 实例008 验证XML...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

md5等待上传