调用后端接口,怎么上传文件流

1.接口设置请求头(form-data)

 // /api/xxx/xxx 声明接口
  export function xxx(data) {
    return request({
      url: '/xxx/xxx/xxx',
      method: 'post',
      data,
      headers: {'Content-Type': 'multipart/form-data'} // 重点,设置请求头
    })
  }

2.创建空formData对象,将文件插入

// FormData.append()
// 向 FormData 中添加新的属性值,如果FormData 对应的属性值存在则覆盖原值,否则新增一项属性值。
  let formData= new FormData()  // 声明formData对象
  formData.append('file', xxx文件) // 插入文件流 xxx文件流

// 也可以添加其他参数到FormData
  formData.append('name', 'John Doe');

将处理好的数据以data形式传入接口即可

import {xxx} from '@/api/xxx/xxx'
xxx(formData).then(res=>{
	// 成功回调
}).catch(()=>{
	// 失败回调
})
文件: 1. 在前端页面中添加一个文件的组件,使用`v-model`指令绑定上文件对象。 ```html <template> <div> <input type="file" v-model="file"> <button @click="uploadFile">上传文件</button> </div> </template> <script> export default { data() { return { file: null, }; }, methods: { async uploadFile() { const formData = new FormData(); formData.append('file', this.file); // 调用后端接口,将文件数据通过FormData对象递给后端 const res = await this.$http.post('/upload', formData); console.log(res); }, }, }; </script> ``` 2. 在后端实现文件接口,使用`multer`中间件处理上传文件。 ```javascript const express = require('express'); const multer = require('multer'); const path = require('path'); const app = express(); // 设置上传文件的存储路径和文件名 const storage = multer.diskStorage({ destination(req, file, cb) { cb(null, 'uploads/'); }, filename(req, file, cb) { const extname = path.extname(file.originalname); cb(null, `${file.fieldname}-${Date.now()}${extname}`); }, }); // 创建multer中间件实例 const upload = multer({ storage }); // 处理文件接口 app.post('/upload', upload.single('file'), (req, res) => { console.log(req.file); res.json({ message: '文件成功' }); }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` 文件下载: 1. 在前端页面中添加一个下载按钮,使用`v-on:click`绑定下载文件的方法。 ```html <template> <div> <button @click="downloadFile">下载文件</button> </div> </template> <script> export default { methods: { async downloadFile() { // 调用后端接口,获取文件数据 const res = await this.$http.get('/download', { responseType: 'blob' }); // 创建Blob对象,用于下载文件 const blob = new Blob([res.data]); const url = window.URL.createObjectURL(blob); // 创建a标签,模拟点击下载 const link = document.createElement('a'); link.style.display = 'none'; link.href = url; link.setAttribute('download', 'file.txt'); document.body.appendChild(link); link.click(); // 释放URL对象 window.URL.revokeObjectURL(url); }, }, }; </script> ``` 2. 在后端实现文件下载的接口,使用`fs`模块读取文件内容,并设置响应头`Content-Disposition`,告诉浏览器下载文件。 ```javascript const express = require('express'); const path = require('path'); const fs = require('fs'); const app = express(); // 处理文件下载的接口 app.get('/download', (req, res) => { const filePath = path.join(__dirname, 'file.txt'); const fileName = path.basename(filePath); const fileStream = fs.createReadStream(filePath); // 设置响应头,告诉浏览器下载文件 res.setHeader('Content-Disposition', `attachment; filename=${fileName}`); res.setHeader('Content-Type', 'application/octet-stream'); fileStream.pipe(res); }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` 注意:以上代码仅供参考,具体实现可能会因为项目需求和环境差异而有所变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值