JS 文件上传 下载文件 批量下载

理解

无论是上传还是下载,对前端来说,都是对数据流进行操作。
常见情况包括:

  • 1、前端使用 input type=‘file’ 标签进行文件读取 获取到file对象这种类型的数据流,将其传给接口
  • 2、前端使用html2canvas等插件进行截图,拿到的是生成后保存在内存中base64编码的二进制数据流, 此时需要根据接口的要求转成对应格式的数据在上传保存。
  • 3.后台返回文件地址 前端访问地址进行文件下载
  • 大部分情况下文件上传后台要求的都是formData对象的格式

文件上传案例


    data(){
        return {
            filename:'',
            inputFilee:'',

            uploaded:false,
        }
    },
    methods: {
        // 选择文件
        chooseFile(){
           this.inputFilee = document.createElement('input');
           this.inputFilee.type = 'file';
           this.inputFilee.addEventListener('change', this.chang);
           // 只允许excel文件
           this.inputFilee.accept = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel';
           this.inputFilee.click();
        },
        chang(){
            this.filename = this.inputFilee.files[0].name;
        },
        // 点击上传  待补全
        upload(){  
            if(this.inputFilee===''){
                this.$message.error('请选择文件')
                return
            }
            // formData.append("uploadFile",this.inputFilee.files[0])
            // http.getFileUrl(`/ufile/upload/img`,formData).then(res => {
            //     if(res.errCode==='00'){
            //         this.uploaded = true;
            //         this.filename = '';
            //         this.inputFilee = '';
            //     }  
            // })
            this.uploaded = true;
            this.filename = '';
            this.inputFilee = '';
        },
        // 重新上传
        reUpload(){
            this.uploaded = false;
        },
    },

html2canv生成图片上传案例

		//文件上传完成后  上传后台文件服务器返回的文件地址链接
        submit(){
         this.write_title_img_url = await this.base64ImgtoFile(await this.createImg('printContent'));               
        },
    methods: {
        async createImg(whichOne){
            return new Promise(resolve=>{
                let view = document.getElementById(whichOne);
                let iframe = view.children[0].children[0].getElementsByClassName('edui-editor-iframeholder edui-default')[0].children[0].contentWindow.document;
                // await this.$nextTick();// this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行
                resolve(this.makeImg(iframe.getElementsByClassName('view')[0].children[1].children[0]))  
            })
        },
        //插件截图
       makeImg(printContent){
            return new Promise(resolve=>{
                html2canvas(printContent, {
                    scale: 2,
                    dpi: 2000,
                    height: printContent.clientHeight + 5, // dom 原始宽度
                    width: printContent.clientWidth + 5, // dom 原始宽度
                    scrollY: 0, // 偏移值
                    scrollX: 0,
                    useCORS: true// 跨域
                }).then(canvas => {
                    let dataURL = canvas.toDataURL('image/png');
                    resolve(dataURL);
                }).catch(err => {
                    console.log(err);
                });
            })
        },
        // 工具函数 base64转换
        async base64ImgtoFile(data) {
            return new Promise(resolve=>{
                var form=document.forms[0];  
                var formData = new FormData(form);
                let filename = this.revtimeToString(new Date)+'.png'
                var arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1],
                    bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
                while(n--){
                    u8arr[n] = bstr.charCodeAt(n);
                }
                let file = new File([u8arr], filename, {type:mime});

                formData.append("uploadFile",file)
                http.getFileUrl(`........后台地址`,formData).then(res => {
                    resolve(res.data)       
                })
            })
        },
        
    },

提出下载报表数据的需求,且有格式要求.
数据处理原理与之前一样,根据需求修改逻辑即可.以下是关于JS文件下载的学习:(直接下载页面数据,无需调用后台)

 var result = ["张三","李四","王五"];//处理好的要下载的数据集result
 var blob = new Blob(["\ufeff" + result.join("")], {type: 'text/csv'}); //  ufeff解决乱码问题
 var downloadLink = document.createElement("a");
 downloadLink.setAttribute("href", URL.createObjectURL(blob));// 字符内容转变成blob地址
  //下面设置文件名  点击触发后移除
 var fileName="测试";
 fileName=fileName.replace(new RegExp(">>", "g"),".");
 fileName+="."+CurentTime()+".csv";
 downloadLink.download =  fileName; 
 document.body.appendChild(downloadLink);
 downloadLink.click();
 document.body.removeChild(downloadLink); 

Blob对象简要介绍

Blob 对象表示一个不可变、原始数据的类文件对象。Blob 表示的不一定是JavaScript原生格式的数据。File 接口基于Blob,继承了 Blob 的功能并将其扩展使其支持用户系统上的文件。

语法
const aBlob = new Blob( array, options );

参数说明

array 是一个由ArrayBuffer, ArrayBufferView, Blob, DOMString 等对象构成的 Array ,或者其他类似对象的混合体,它将会被放进 Blob。DOMStrings会被编码为UTF-8。
options 是一个可选的BlobPropertyBag字典,它可能会指定如下两个属性:
type,默认值为 “”,它代表了将会被放入到blob中的数组内容的MIME类型。
endings,默认值为"transparent",用于指定包含行结束符\n的字符串如何被写入。 它是以下两个值中的一个: “native”,代表行结束符会被更改为适合宿主操作系统文件系统的换行符,或者 “transparent”,代表会保持blob中保存的结束符不变

URL.createObjectURL() 与介绍

URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。相当于这个方法创建了一个传入对象的内存引用地址

参考原理剖析:前端通过Blob实现文件下载
参考流程:JS知识点:文件下载

项目常用方式:
压缩包,word文件等普通下载

   preview(url) {
	   // window.open(url);
      let a = document.createElement("a");
      a.style.display = "none";
      a.target = "_blank";
      document.body.appendChild(a);
      a.href = url;
      a.setAttribute("download", "link"); // 指示浏览器下载url,而不是导航到它
      a.click();
      document.body.removeChild(a);
   },

图片 音频等会被浏览器直接打开的下载:

    downloadFile(url,name){    
      var a = document.createElement('a');
      // 先将地址转化为二进制
      var blob = new Blob([url]);
      a.href = URL.createObjectURL(blob);
      // 剪切链接字符串最后的文件名称
      // debugger
      a.download = name;
      a.click();
      document.body.removeChild(a);
    },

批量下载

//  批量下载
        downloadFile(url){
          const iframe = document.createElement("iframe");
          iframe.style.display = "none";  // 防止影响页面
          iframe.style.height = 0;  // 防止影响页面
          iframe.src = url;
          document.body.appendChild(iframe);  // 这一行必须,iframe挂在到dom树上才会发请求
          // 5分钟之后删除(onload方法对于下载链接不起作用,就先抠脚一下吧)
          setTimeout(()=>{
            iframe.remove();
          }, 5 * 60 * 1000);
        },

        bulkDownload(urlList){
          let jsonUrlList = JSON.parse(urlList);
          let that = this;
          for(let i =0;i<jsonUrlList.length;i++){  //循环遍历调用downloadFile方法
            const url = jsonUrlList[i].response.msg;
            this.downloadFile(url);
          }
        },
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,针对你的第一个问题,我可以告诉你如何使用 JavaScript 实现 OSS 批量下载文件的功能。 首先,你需要使用阿里云提供的 OSS SDK for JavaScript,通过 npm 安装: ``` npm install ali-oss --save ``` 然后,你可以使用以下代码实现批量下载文件: ```javascript const OSS = require('ali-oss'); const co = require('co'); const fs = require('fs'); // 创建 OSS 客户端实例 const client = new OSS({ accessKeyId: '<AccessKeyId>', accessKeySecret: '<AccessKeySecret>', bucket: '<BucketName>', region: '<Region>', }); // 要下载文件列表 const files = [ 'path/to/file1.txt', 'path/to/file2.txt', 'path/to/file3.txt', ]; // 下载文件 co(function* () { for (let file of files) { const result = yield client.get(file); fs.writeFileSync(`./${file}`, result.content); } }).catch(function (err) { console.log(err); }); ``` 这段代码首先创建了一个 OSS 客户端实例,然后定义了要下载文件列表,最后使用 `co` 库实现异步流程控制,循环遍历文件列表,逐个下载文件并保存到本地。 至于你提到的第二个问题,我可以告诉你如何在 NestJS 中使用阿里云 OSS 进行文件。 首先,你需要安装 `@nest-modules/multer` 和 `ali-oss` 两个库: ``` npm install @nest-modules/multer ali-oss --save ``` 然后,你可以在 NestJS 中定义一个上服务: ```typescript import { Injectable } from '@nestjs/common'; import { MulterModule } from '@nest-modules/multer'; import * as OSS from 'ali-oss'; @Injectable() export class UploadService { private client: OSS; constructor() { this.client = new OSS({ accessKeyId: '<AccessKeyId>', accessKeySecret: '<AccessKeySecret>', bucket: '<BucketName>', region: '<Region>', }); } async upload(file: Express.Multer.File): Promise<string> { const result = await this.client.put(file.originalname, file.buffer); return result.url; } } ``` 这段代码定义了一个 `UploadService`,通过 `ali-oss` 库创建了一个 OSS 客户端实例,在 `upload` 方法中实现了文件功能,返回上后的文件 URL。 最后,你可以在 NestJS 控制器中使用这个上服务: ```typescript import { Controller, Post, UseInterceptors, UploadedFile } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import { UploadService } from './upload.service'; @Controller('upload') export class UploadController { constructor(private readonly uploadService: UploadService) {} @Post() @UseInterceptors(FileInterceptor('file')) async upload(@UploadedFile() file: Express.Multer.File): Promise<string> { return this.uploadService.upload(file); } } ``` 这段代码定义了一个 `UploadController` 控制器,使用 `@UseInterceptors` 装饰器启用 `FileInterceptor` 中间件,将上文件递给 `upload` 方法,调用上服务上文件并返回文件 URL。 希望这些代码能够帮助到你,如果你还有其他问题,可以随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳动的世界线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值