当前位置: 首页 > 后端技术 > Node.js

文件上传下载实现(react、express、create-react-app脚手架)

时间:2023-04-03 23:01:21 Node.js

项目结构前后端分离,中间有一层节点。文件上传需求:向后台发送文件信息等。html代码客户端上传文件时的信息处理可以使用FormData异步上传一个二进制文件。上传文件时,如果使用form表单上传,需要设置form的enctype等于multipart/form-data,因为这个value的默认值为application/x-www-form-urlencoded。使用axios库上传时,需要设置Content-Type为multipart/form-data。使用fetch上传,无需设置Content-Type。constfile=document.querySelector('[type=file]');constformData=newFormData();formData.append("file",file.files[0]);formData.append("userName","admin");axios.post("/api/list/upload",formData,{headers:{"Content-Type":"multipart/form-data"}}).then(()=>{console.log("上传成功");});发送成功数据的外观FormData如果需要传输数组之类的,根据后台使用的语言和框架选择,比如后台使用PHP,可以这样写:fileList.forEach((file)=>{formData.append('files[]',file);});文件下载html代码模板下载节点端处理因为项目使用express,所以可以直接通过res.download方法下载文件。在server.js文件中添加//下载文件constpath=require("path");app.use("/download/",function(req,res){constfilepath=path.join(__dirname,req.url+".xlsx");//文件存放路径res.download(filepath);});文件结构有问题,因为是用create-react-app构建的,在本地开发环境测试下载文件时,总是找不到正确的下载路径。后来在create-react-app描述页面的ProxyingAPIRequestsinDevelopment模块中找到了这么一段话。这样,当您在开发中fetch('/api/todos')时,开发服务器将识别它不是静态资产,并将您的请求代理到http://localhost:4000/api/todos作为后备。开发服务器只会尝试将其Accept标头中没有text/html的请求发送到代理。大概意思就是开发的时候,请求fetch('/api/todos'),开发服务器意识到它不是一个静态资产,所以会Proxy这个请求。开发服务器只会代理Accept标头中没有text/html的请求。所以在本地开发环境测试下载的文件时,总是找不到下载文件的正确路径。解决方法1、开发测试时直接写href作为完整的请求路径。当然,测试完成后,要把“http://20.26.150.69:3001”删掉。templatedownload方法二根据手动配置代理所有匹配该路径的请求都会在create-react-app描述中被代理页,无一例外。这包括对标准代理选项不代理的text/html请求。这意味着所有匹配此路径的请求都将被代理,包括对text/html的请求。因此,您可以将package.json中的内容更改为这样的内容,并将Accept标头中带有text/html的请求包含在代理的范围内。参考自:FormData.append()