首页 > 编程语言 >node实现文件上传和文件下载

node实现文件上传和文件下载

时间:2023-04-21 15:58:47浏览次数:30  
标签:node 文件 return data file HASH 上传

node 实现文件上传和下载

  1. 安装 multer 和 fs 模块

    npm install multer fs --save
    //multer 文件上传,fs 文件处理
    
  2. 上传文件并存放相应路径下

    multer({dest:"upload"}).single('file')
    //dest 后是文件存放的地址,single 中的为 filename
    //.single(fieldname) - 单个文件上传
    //.array(fieldname,[maxCount]) - 多个文件上传
    
  3. 修改上传后的文件名称

    fs.renameSync(file.path,`upload/${file.   originalname}`)
    

    问题:用 multer 上传了文件后,文件名为乱码
    解决方法:
    fs.rename 或 fs.renameSync()修改文件名称
    第一个参数为:当前路径
    第二个参数为:新的路径

Axios 用法「包含基础的二次封装」& 前后端通信常用数据格式


  • Axios 用法「包含基础的二次封装」

    let instance = axios.create();
    //设置请求路径
    instance.defaults.baseURL = 'http://127.0.    0.1:8888';
    //设置请求头
    instance.defaults.headers['Content-Type']     = 'multipart/form-data';
    //用 qs 插件格式化请求参数
    instance.defaults.transformRequest =     (data, headers) => {
    const contentType = headers    ['Content-Type'];
    if (contentType === "application/    x-www-form-urlencoded") return Qs.    stringify(data);
    return data;
    };
    //响应拦截器
    instance.interceptors.response.use    (response => {
    return response.data;
    });
    
    
  • 前后端通信常用数据格式 1.单文件上传处理「FORM-DATA」:由服务器自动生成文件的名字

    url:/upload_single
    method:POST
    params:multipart/form-data
    file:文件对象
    filename:文件名字
    return:application/json
    code:0 成功 1 失败,
    codeText:状态描述,
    originalFilename:文件原始名称,
    servicePath:文件服务器地址
    

    2.单文件上传处理「FORM-DATA」:由客户端生成文件的名字,传递给服务器处理

    url:/upload_single_name
    method:POST
    params:multipart/form-data
    file:文件对象
    filename:文件名字「自己需要处理成为 HASH 名   字」
    return:application/json
    code:0 成功 1 失败,
    codeText:状态描述,
    originalFilename:文件原始名称,
    servicePath:文件服务器地址
    

    3.单文件上传处理「BASE64」

    url:/upload_single_base64
    method:POST
    params:application/x-www-form-urlencoded
    file:BASE64
    filename:文件名字
    return:application/json
    code:0 成功 1 失败,
    codeText:状态描述,
    originalFilename:文件原始名称,
    servicePath:文件服务器地址
    

    4.上传切片
    url:/uploadchunk
    method:POST
    params:multipart/form-data
    file:切片数据
    filename:切片名字「文件生成的 HASH
    切片编号.后缀」
    return:application/json
    code:0 成功 1 失败,
    codeText:状态描述,
    originalFilename:文件原始名称,
    servicePath:文件服务器地址

    5.合并切片
    

    url:/upload_merge
    method:POST
    params:application/x-www-form-urlencoded
    HASH:文件的 HASH 名字
    count:切片数量
    return:application/json
    code:0 成功 1 失败,
    codeText:状态描述,
    originalFilename:文件原始名称,
    servicePath:文件服务器地址

    6.获取已经上传的切片
    

    url:/upload_already
    method:GET
    params:
    HASH:文件的 HASH 名字
    return:application/json
    code:0 成功 1 失败,
    codeText:状态描述,
    fileList:[...]

    
    

基于 FileReader 实现文件读取和相关处理


基于 spark-md5 实现文件名的生成

const changeBuffer = file => {
return new Promise(resolve => {
let fileReader = new FileReader();// 实例化文件阅读器
fileReader.readAsArrayBuffer(file);// 开始阅读这个文件,阅读完成触发 onl oad 方法
fileReader.onload = ev => {
let buffer = ev.target.result,
spark = new SparkMD5.ArrayBuffer(),// 实例化 spark-md5
HASH,
suffix;
spark.append(buffer);//添加到 spark 算法中计算
HASH = spark.end();//计算完成得到 hash 结果
suffix = /\.([a-zA-Z0-9]+)$/.exec(file.name)[1];
                resolve({
                    buffer,
                    HASH,
                    suffix,
                    filename: `${HASH}.${suffix}`
});
};
});
};


掌握上传文件大小或者格式等限制的处理


实现上传文件的缩略展示


掌握文件上传的两种经典方案:FormData & BASE64


  • FormData 实现文件上传

<!-- 创建 formData 对象,为对象中添加键值对(file-xxxfilename-xxx)发 post请求 -->

let formData=new FormData()
formData.append('file',上传的文件对象)
formData.append('filename',上传的文件名)
axios.post(url,formData).then().catch()

  • BASE64 实现文件上传
  <!-- 实例化 fileReader 对象,
  调它的 readAsDataURL 并把 File 对象传给它,
  监听它的 onl oad 事件,load 完读取的结果就在的 result 属性里了. -->

    const changeBASE64 = file => {
        return new Promise(resolve => {
            let fileReader = new FileReader();
            fileReader.readAsDataURL(file);
            fileReader.onload = ev => {
                resolve(ev.target.result);
            };
        });
    };
    BASE64 = await changeBASE64(file);
    async function(){
        try {
            data = await instance.post('/upload_single_base64', {
                file: encodeURIComponent(BASE64),
                filename: file.name
            }, {
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            });
            if (+data.code === 0) {
                alert(`恭喜您,文件上传成功,您可以基于 ${data.servicePath} 地址去访问~~`);
                return;
            }
            throw data.codeText;
        } catch (err) {
            alert('很遗憾,文件上传失败,请您稍后再试~~');
        }
    }

实现上传进度的展示和管控


实现文件拖拽上传的功能


大文件切片上传的实现及优化


多文件上传及进度管控


断点续传实现的方案及原理


了解服务器端是如何基于 Node+Express+multiparty 管理文件上传的


标签:node,文件,return,data,file,HASH,上传
From: https://www.cnblogs.com/hxy--Tina/p/17320777.html

相关文章

  • ssh-keygen 生成.ssh文件
    ssh-keygen-trsa-C"[email protected]":生成最新OPENSSH格式的密钥对。openssh格式 ssh-keygen-mPEM-trsa-b4096-C"[email protected]"生成老版本的rsa格式的密钥对。rsa格式 参数说明-m:参数指定密钥的格式,PEM(也就是RSA格式)是之前使用的旧格式-b:指定密钥长度;-e:......
  • C#一个界面类下面有多个CS文件
    一.当我们用VS创建一个Form窗体时,会生成一个窗体类和设计类 二.当界面复杂,并且每个界面有多少关联的类时,我们需要按一定规则放,可以放在该窗体下面打开.csproj文件,增加一个修改FormSub1和Form2Sub2的Compile节点(如果没有,直接增加)修改后,保存,重新用VS打开项目(VS2010和VS201......
  • spring boot项目上传文件
    严重:Servlet.service()forservlet[dispatcherServlet]incontextwithpath[]threwexception[Requestprocessingfailed;nestedexceptionisorg.springframework.web.multipart.MaxUploadSizeExceededException:Maximumuploadsizeexceeded;nestedexception......
  • Mac开发_NSTreeNode
    1、创建示例2、API说明@interfaceNSTreeNode:NSObject/***@brief创建一个包含指定modelObject对象的新树节点**@parammodelObject表示该节点的modelObject对象,可为nil*@return新创建的树节点**@discussion该方法创建了一......
  • node实现登录图片验证码
    实现这里的图形验证码我是用的node里svg-captcha模块,可以全部支持字符和数字,全平台支持,用起来很简单。安装cnpmisvg-captcha--save在使用的地方导入varsvgCaptcha=require('svg-captcha');获取验证码安装cookie-parser,作用是将获取到的session保存到cookie,方便......
  • PHPCMS 实现ctrl+v粘贴图片并上传、word粘贴带图片
    ​ 这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下)<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@     page contentType="text/html;cha......
  • tomcat提示静态文件缓存超限,造成日志爆满的问题
    日志片段:21-Apr-202311:20:47.215警告[http-nio-80-exec-5308]org.apache.catalina.webresources.Cache.getResourceUnabletoaddtheresourceat[/FileUploads/www/site/2022/11/30/ZZVRQAHD08ZX4GOW47.jpg]tothecacheforwebapplication[]becausetherewasin......
  • Ubuntu 搭建一个局域网文件存储服务器
    在Ubuntu上搭建一个局域网文件存储服务器可以使用Samba服务,Samba是一个能够与Windows兼容的文件和打印机共享服务。下面是搭建过程:安装Samba服务打开终端,运行以下命令安装Samba:sqlCopycodesudoapt-getupdatesudoapt-getinstallsamba创建共享文件夹......
  • Aras学习笔记 (53) - 根据ID快速找到文件Vault路径
    Step1:首先在对象类File中根据名称找到ID;Step2:右键文件-->Share-->CopyID;Step3:在Console中输入下命令:top.aras.IomInnovator.getFileUrl("[文件ID]",top.aras.Enums.UrlType.SecurityToken)结果如下: ......
  • Node.js
     nodejs到底是什么?nodejs是一个开源的,跨平台的JavaScript运行环境;是JavaScript运行的平台,类似于浏览器。不是框架,不是库,也不是语言。通俗来说,就是一款应用程序,它可以运行JavaScript。运行平台:一般就是指一个代码的运行环境;作用是:开发者可以使用指定的编程语言,基于某个环境......