博客 / 詳情

返回

關於require('mkdirp')創建文件夾

mkdirp

npm i mkdirp -S // 1.0.4
今天在寫上傳文件時候,查看同步創建文件如是使用了mkdirp包,不過發現網絡有大部分錯誤用法,原因是mkdirp的版本升級了更改了用法

網絡錯誤用法

const mkdirp = require('mkdirp');
await mkdirp(dir) //錯誤用法一
const mkdirp = require('mkdirp');
//錯誤用法二
mkdirp('./tmp/foo/bar/baz', function (err) {
  console.log(err); 
});

正確寫法

const mkdirp = require('mkdirp')

// 返回值是一個Promise,解析為創建的一個目錄  
mkdirp('/tmp/foo/bar/baz').then(made =>
  console.log(made)
)
const mkdirp = require('mkdirp')

// 返回目錄 同步寫法
const made = mkdirp.sync('/tmp/foo/bar/baz')
console.log(made)

使用實例

// 上傳圖片
async uploadImg() {
        const { ctx } = this
        const parts = ctx.multipart({ autoFields: true })
        const urls = []
        const dir = path.join(this.config.baseDir, 'app/public/upload/image/', dayjs().format('YYYY-MM-DD'))
        await mkdirp.sync(dir)
        let stream
        while ((stream = await parts()) != null) {
            const fileType = stream.mimeType.split('/')[1]
            const filename = dayjs().valueOf() + '.' + fileType || stream.filename.toLowerCase()
            const target = path.join(dir, filename)
            urls.push(`/public/upload/image/${filename}`)
            const writeStream = await fs.createWriteStream(target)
            await pump(stream, writeStream)
        }
        return urls[0]
    }
// 上傳文件
    async uploadFile() {
        const { ctx } = this
        const urls = []
        const stream = await ctx.getFileStream()
        const dir = path.join(this.config.baseDir, 'app/public/upload/file/', dayjs().format('YYYY-MM-DD'))
        await mkdirp.sync(dir)
        const fileType = stream.filename.toLowerCase().split('.')
        const filename = dayjs().valueOf() + '.' + fileType[fileType.length - 1]
        // 生成寫入路徑
        const target = path.join(dir, filename)
        const writeStream = await fs.createWriteStream(target) // 寫入流
        stream.pipe(writeStream) // 以管道方式寫入流
        await new Promise((resolve, reject) => {
            writeStream.on('finish', () => {
                // 監聽寫入完成事件
                urls.push(`/public/upload/file/${filename}`)
                resolve(stream.fields)
            })
            writeStream.on('error', async (err) => {
                await sendToWormhole(stream) // 關閉管道
                writeStream.destroy() // 銷燬
                reject(err)
            })
        })
        return urls[0]
    }

在線代碼

GitHub代碼

調用該方法

image.png

user avatar pangsir8983 頭像 icezero 頭像 mouyi_63f6f68ba66d9 頭像 yookoo 頭像 chamson_5eb23538190b0 頭像 dexteryao 頭像
6 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.