前端vue+express实现文件的上传下载示例
作者:lxslxskxs 发布时间:2024-05-13 09:12:03
标签:vue,expres,上传,下载
新建server.js
yarn init -y
yarn add express nodemon -D
var express = require("express");
const fs = require("fs");
var path = require("path");
const multer = require("multer"); //指定路径的
var app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// 前端解决跨域问题
app.all("*", (req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
next();
});
// 访问静态资源
app.use(express.static(path.join(__dirname)));
// 文件上传
app.post("/upload", multer({ dest: "./public" }).any(), (req, res) => {
const { fieldname, originalname } = req.files[0];
// 创建一个新路径
const name = fieldname.slice(0, fieldname.indexOf("."));
const newName = "public/" + name + path.parse(originalname).ext;
fs.rename(req.files[0].path, newName, function (err) {
if (err) {
res.send({ code: 0, msg: "上传失败", data: [] });
} else {
res.send({ code: 1, msg: "上传成功", data: newName });
}
});
});
// 文件下载
app.get('/download', function(req, res) {
res.download('./public/test.xls');
});
// 图片下载
app.get('/download/img', function(req, res) {
res.download('./public/2.jpg');
});
let port = 9527;
app.listen(port, () => console.log(`端口启动: http://localhost:${port}`));
(1):前端文件上传请求
第一种: form表单
<form action="http://localhost:9527/upload" method="POST" encType="multipart/form-data">
<input type="file" name="user"/>
<input type="submit" />
</form>
第一种: input输入框
<input type="file" @change="changeHandler($event)"/>
changeHandler(event) {
let files = event.target.files[0];
console.log("files",files)
let data = new FormData();
data.append(files.name,files);
console.log("data",data)
axios.post("http://localhost:9527/upload",data,{
headers:{
"Content-Type":"multipart/form-data"
}
}).then(res =>{
console.log("res",res)
})
},
(2):前端文件下载
第一种: 后端返回一个下载的链接地址,前端直接使用 即可
第二种: 使用二进制流文件下载
<input type="button" value="点击下载" @click="handleDownload">
handleDownload() {
axios({
method: 'get',
url: "http://localhost:9527/download",
data: {
test: "test data"
},
responseType: "arraybuffer" // arraybuffer是js中提供处理二进制的接口
}).then(response => {
// 用返回二进制数据创建一个Blob实例
if(!response) return;
let blob = new Blob([response.data], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
}) // for .xlsx files
// 通过URL.createObjectURL生成文件路径
let url = window.URL.createObjectURL(blob)
console.log("url==========",url)
// 创建a标签
let ele = document.createElement("a")
ele.style.display = 'none'
// 设置href属性为文件路径,download属性可以设置文件名称
ele.href = url
ele.download = this.name
// 将a标签添加到页面并模拟点击
document.querySelectorAll("body")[0].appendChild(ele)
ele.click()
// 移除a标签
ele.remove()
});
},
(3) 附加:二进制流图片的下载
// 二进制流图片文件的下载
downLoadImg() {
axios({
method: 'get',
url: `http://localhost:9527/download/img`,
responseType: 'arraybuffer',
params: {
id: 12
}
}).then(res => {
var src = 'data:image/jpg;base64,' + btoa(new Uint8Array(res.data).reduce((data, byte) => data + String.fromCharCode(byte), ''))
// this.srcImg = src // 图片回显
var a = document.createElement('a')
a.href = src
a.download = '2.jpg'
a.click()
a.remove()
})
}
来源:https://blog.csdn.net/lxs19930928/article/details/122192837


猜你喜欢
- 问题一开始安装的Autoprefixer是最新版本的3.0.1,一波操作后发现无效想是不是因为没设置browsers?那就设置一下吧&quo
- 首先让我祭出一张数学王子高斯的照片,这位印在德国马克上的神人有多牛呢? 他是近代数学的奠基人之一,与牛顿, 阿基米德并称顶级三大数学家,随便
- 相信每个前端工程师都有自己喜爱的javascript框架,说情感也好,道信仰也罢,javascript框架带给人的不仅仅是便捷的开发,更有一
- 背景最近在需求中有一个这样的场景:需要在页面关闭的时候,用户不需要操作,主动关闭当前订单当时考虑的方案:在页面关闭的时候,向后端发送一个请求
- 爬取 * 及测试是否可用很多人在爬虫时为了防止被封IP,所以就会去各大网站上查找免费的 * ,由于不是每个IP地址都是有效的,如果要进去
- 本文为大家分享了centos7利用yum安装mysql 8.0.12的详细步骤,供大家参考,具体内容如下清理原有的mysqlrpm -qa
- 工作时需要取得MySQL中一个表的字段是否存在于是就使用Describe命令来判断mysql_connect(localhost, root
- 1. 创建主窗口上文中我们建立的图形界面程序 GUIdemo2.py,通过导入图形界面 uiDemo1.py,已经实现了主窗口的创建。1.1
- 在默认情况下,MySQL搜索不区分大小写(但某些字符集始终区分大小写,如czech)。这意味着,如果你使用col_name LIKE
- 最近导师让我跑模型,生物信息方向的,我一个学计算机的,好多东西都看不明白。现在的方向大致是,用深度学习的模型预测病毒感染人类的风险。既然是病
- 本文实例讲述了Go语言判断文件或文件夹是否存在的方法。分享给大家供大家参考,具体如下:Golang 判断文件是否存在有点怪异,是根据在操作文
- 本文实例讲述了Python实现文件按照日期命名的方法。分享给大家供大家参考。具体实现方法如下:这里实现文件按照创建的时期批量重命名的功能#
- <% a="福建是中国的一个省|我们美丽中国的武夷山!" b="中国,我们,武夷山,福建,美国,苹果&q
- 区别IE6与FF:background:orange;*background:blue;区别IE6与IE7:background:green
- 想必大家都知道MSSQL中SA权限是什么,可以说是至高无上。今天我就它的危害再谈点儿,我所讲的是配合NBSI上传功能得到WebShell。在
- 在python中,一个文件(以“.py”为后缀名的文件)就叫做一个模块,每一个模块在python里都
- 本人电脑上的Python为3.5,安装在Windows上,虽然安装过程中选择了pip,但是在命令行输入pip后仍然不能成功,尝试一下方法,终
- 下载的数据是pascal voc2012的数据,已经有annotation了,不过是xml格式的,训练的模型是在Google模型的基础上加了
- 但是Class这个东西,如果用得比较少,充其量只是一个大模块的包装方式. 只有大规模地用它来开发,才能显出它对项目管理的优越性来. 所谓的意
- 制作文件备份打开原文件 old_f_name = input(“请输入备份的文件路径:”) old_f = open(old_f_name,