NodeJS移动文件

NodeJS移动文件

  1. 都需要使用fs模块 const fs = require('fs')
  2. 可选:使用path模块const path = require('path')指定文件的上传路径
  3. 上传之后都需要删除文件的缓存fs.unlinkSync
  4. 如果使用的是eggjs则可以调用ctx.cleanupRequestFiles()清除文件的缓存
  5. 一下例子以eggjs框架为例
  6. eggjs中的文件上传需要在config.default.js中加入代码,开启egg-multipart
const config = (exports = {
    multipart: {
        fileSize: "5mb",
        mode: 'file',
    }
})

1. 使用createReadStreamcreateWriteStream的方式

const {ctx} = this
// 获取上传的文件
const getFile = ctx.request.files[0]
// getFile.filepath 文件缓存的地址
// 创建 stream 流
const getReadStream = fs.createReadStream(getFile.filepath)
// path.join(__dirname,`../public/upload/avatar/`, 'test.txt') 指定文件保存的地址和文件名
// 写入文件的 stream 流
const getWriteStream = fs.createWriteStream(path.join(__dirname,`../public/upload/avatar/`, 'test.txt'))
getReadStream.pipe(getWriteStream)
// 清除上传的文件缓存
ctx.cleanupRequestFiles()
// 或者 fs.unlinkSync(getFile.filepath)

2. 使用readFileSyncwriteFileSync的方式

const {ctx} = this
// 获取上传的文件
const getFile = ctx.request.files[0]
// getFile.filepath 文件缓存的地址
// 使用 try catch 捕获 error
try {
    const readFileData = fs.readFileSync(getFile.filepath)
	fs.writeFileSync(path.join(__dirname,`../public/upload/avatar/`, 'test.txt'))
} catch(err) {
    
}
// 清除上传的文件缓存
ctx.cleanupRequestFiles()
// 或者 fs.unlinkSync(getFile.filepath)

3. 使用rename出现的问题

Error: EXDEV: cross-device link not permitted, rename,文件移动被禁止,原因可能是因为文件缓存的地址是C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\2\\egg-multipart-tmp\\egg_node\\2020\\09\\29\\15\\c6e70360-b82a-4a73-b610-47c83d8f991a.jpgC盘下的,移动不允许到其他盘符

try {
    fs.renameSync(getFile.filepath, path.join(__dirname, `../public/upload/avatar/`, 'test.txt'))
    ctx.body = no_data_success('文件上传成功')
} catch (error) {
    console.log(error, 'error') 
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值