node编写上传文件的接口

node编写上传文件的接口

前期写的接口一直都是往服务器里面传数据,第一次往服务器写图片文件,和普通的node接口还有一定的区别,而且用postman测试与常规接口的方法也不一致,记录一下,便于后续编写接口

node接口

先直接上代码,再解释下代码实现的逻辑

const express = require('express');
const router = express.Router();
// 上传图片接口
const fs = require('fs');
const multer = require('multer')

const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, './uploads')
    },
    filename: (req, file, cb) => {
        cb(null, Date.now() + file.originalname)
    }
})

const createFolder = folder => {
    try {
        fs.accessSync(folder)
    } catch (err) {
        fs.mkdirSync(folder)
    }
}

const uploadFolder = './uploads/'
createFolder(uploadFolder)
const upload = multer({
    storage
})

router.post('/upload', upload.single('file'), (req, res) => {
    const file = req.file
    console.log('文件类型: %s', file.mimeType)
    console.log('原始文件名: $s', file.originalname)
    console.log('文件大小: %s', file.size)
    console.log('文件保存路径: %s', file.path)
    res.json({
        res_code: 0,
        name: file.originalname,
        url: file.url
    })
})


module.exports = router
  1. const storage 用来设置文件的存放路径,其中destination是文件的目标路径,就是说通过这个接口,上传后会把数据上传到./uploads这个相对路径之下,这里的路径我还有点没搞明白,因为./uploads只有一个点,而我这个接口文件并不在根目录下,我设定的路径是根目录下创建一个upload文件夹,用来存放上传的数据,所以我以为正确的写法应该是…/uploads,结果它在我的根目录外面一层目录下创建了这个upload文件夹,所以我只能理解为这个相对路径相对的是根目录(不知道理解上是否有偏差),下面是我的文件结构:上面的代码写在router文件夹下的路由文件中,最后生成的uploads文件夹却在api根目录下,这里理解还有点不到位

    api:.
    ├─db
    ├─router
    ├─router_handle
    ├─up
    └─uploads

  2. const createFolder创建文件夹过程

  3. const upload是在创建一个multer对象,并把第一步定义的storage传参进去

  4. 后面就是写post请求了,本来我是写的分布式接口处理,即路由处理函数写在router_handle文件夹下的路由处理文件中,但这里post请求时传递了第三步定义的upload对象,有点混乱,就没写分布式路由了,直接写在路由文件中

postman测试接口

文件上传的测试还有点麻烦,流程如下

  1. 输入post请求的地址在这里插入图片描述

  2. 设置请求头,必须按图中设置 在这里插入图片描述

  3. 设置请求体 body->form-data,按图中去设置,注意,第0步中的key值必须与接口请求中的router.post('/upload', upload.single('file')括号里的名称保持一致,否则会报错
    在这里插入图片描述

  4. 点击send即可发生数据
    . 在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是使用Node.js编写一个分片上传的示例代码: ```javascript const fs = require('fs'); const axios = require('axios'); // 读取文件并进行分片上传 async function uploadFile(filePath, chunkSize, uploadUrl) { try { const fileStat = fs.statSync(filePath); const fileSize = fileStat.size; const fileStream = fs.createReadStream(filePath, { highWaterMark: chunkSize }); let offset = 0; let chunkIndex = 0; while (offset < fileSize) { const chunkData = await readChunk(fileStream, chunkSize); await uploadChunk(chunkData, chunkIndex, uploadUrl); offset += chunkSize; chunkIndex++; } console.log('File uploaded successfully!'); } catch (error) { console.error('Error uploading file:', error); } } // 读取指定大小的文件片段 function readChunk(fileStream, chunkSize) { return new Promise((resolve, reject) => { const chunks = []; let totalBytesRead = 0; fileStream.on('data', (chunk) => { chunks.push(chunk); totalBytesRead += chunk.length; if (totalBytesRead >= chunkSize) { const data = Buffer.concat(chunks); fileStream.removeListener('data'); resolve(data); } }); fileStream.on('end', () => { const data = Buffer.concat(chunks); resolve(data); }); fileStream.on('error', reject); }); } // 上传文件片段 function uploadChunk(chunkData, chunkIndex, uploadUrl) { return new Promise(async (resolve, reject) => { try { const response = await axios.post(uploadUrl, chunkData, { headers: { 'Content-Type': 'application/octet-stream' }, params: { index: chunkIndex } }); console.log(`Chunk ${chunkIndex} uploaded successfully`); resolve(response.data); } catch (error) { console.error(`Error uploading chunk ${chunkIndex}:`, error); reject(error); } }); } // 使用示例 const filePath = 'path/to/file.ext'; const chunkSize = 1024 * 1024; // 1MB const uploadUrl = 'http://example.com/upload'; uploadFile(filePath, chunkSize, uploadUrl); ``` 上述代码使用`fs`模块读取文件并进行分片上传。`readChunk`函数用于读取指定大小的文件片段,`uploadChunk`函数用于上传文件片段。在`uploadFile`函数中,通过循环读取文件片段并上传,直到整个文件上传完成。 请注意,上述代码仅为示例,实际情况中可能需要根据具体需求进行修改和调整。此外,还需要根据实际情况处理错误和异常情况,并根据上传接口的要求进行适当的请求配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

栀椩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值