通过 100 多个技巧学习 Nuxt!

nuxt-file-storage
nuxt-file-storage

在您的 Nuxt 应用程序中存储文件的简易解决方案。从前端上传文件,并从后端接收文件,以便将文件保存在您的项目中。

Nuxt File Storage Banner

Nuxt 文件存储

Visits Badgenpm versionnpm downloadsLicenseNuxt

在您的 Nuxt 应用程序中存储文件的简易解决方案。能够从前端上传文件,并从后端接收文件,然后将文件保存在您的项目中。

功能

  • 📁  从文件输入中获取文件,并使其准备好发送到后端
  • ⚗️  在后端序列化文件,以便能够适当地使用它们
  • 🖴  使用 Nitro 引擎将文件存储在您的 Nuxt 后端中的指定位置

快速设置

  1. nuxt-file-storage 依赖项添加到您的项目中
# Using pnpm
pnpm add -D nuxt-file-storage

# Using yarn
yarn add --dev nuxt-file-storage

# Using npm
npm install --save-dev nuxt-file-storage
  1. nuxt-file-storage 添加到 nuxt.config.tsmodules 部分
export default defineNuxtConfig({
    modules: ['nuxt-file-storage'],
})

就这些!您现在可以在您的 Nuxt 应用程序中使用 Nuxt Storage 了 ✨

配置

您目前可以配置 nuxt-file-storage 模块的单个设置。这是配置接口

export default defineNuxtConfig({
    modules: ['nuxt-file-storage'],
    fileStorage: {
        // enter the absolute path to the location of your storage
        mount: '/home/$USR/development/nuxt-file-storage/server/files',

        // {OR} use environment variables (recommended)
        mount: process.env.mount
        // you need to set the mount in your .env file at the root of your project
    },
})

用法

在前端处理文件

您可以使用 Nuxt Storage 从 <input> 标签获取文件

<template>
    <input type="file" @input="handleFileInput" />
</template>

<script setup>
    // handleFileInput can handle multiple files
    // clearOldFiles: true by default, each time the user adds files the `files` ref will be cleared
    const { handleFileInput, files } = useFileStorage({ clearOldFiles: false })
</script>

files 返回一个包含文件的 ref 对象

如果您需要检查文件输入是否已完成,则 handleFileInput 返回一个 promise


这是一个使用文件将它们发送到后端的示例

<template>
    <input type="file" @input="handleFileInput" />
    <button @click="submit">submit</button>
</template>

<script setup>
const { handleFileInput, files } = useFileStorage()

const submit = async () => {
    const response = await $fetch('/api/files', {
        method: 'POST',
        body: {
            files: files.value
        }
    })
}
</script>

处理多个文件输入字段

您必须为每个输入字段创建一个新的 useFileStorage 实例

<template>
    <input type="file" @input="handleFileInput" multiple />   ← | 1 |
    <input type="file" @input="profileInputHandler" />                 ← | 2 |
</template>

<script setup>
    const { handleFileInput, files } = useFileStorage()       ← | 1 |

    const {
        handleFileInput: profileInputHandler,
        files: profileImage
    } = useFileStorage()                                               ← | 2 |
</script>

通过调用一个新的 useFileStorage 实例,您可以分隔输入之间的内部逻辑

在后端处理文件

使用 Nitro Server Engine,我们将创建一个 api 路由来接收文件并将它们存储在 userFiles 文件夹中

export default defineEventHandler(async (event) => {
    const { files } = await readBody<{ files: File[] }>(event)

    for ( const file of files ) {
        await storeFileLocally(
            file,         // the file object
            8,            // you can add a name for the file or length of Unique ID that will be automatically generated!
            '/userFiles'  // the folder the file will be stored in
        )

        // {OR}

        // Parses a data URL and returns an object with the binary data and the file extension.
        const { binaryString, ext } = parseDataUrl(file.content)
    }

    return 'success!'
})

interface File {
    name: string
    content: string
}

就这些!现在,您可以从用户那里将任何文件存储在您的 nuxt 项目中 ✨

贡献

遇到问题?打开一个新问题。如果它符合项目的范围,我将尽力包括所有请求的功能。

想要添加一些功能?欢迎提交 PR!

  • 克隆此存储库
  • 安装依赖项
  • 准备项目
  • 运行开发服务器
git clone https://github.com/NyllRE/nuxt-file-storage && cd nuxt-file-storage
npm i
npm run dev:prepare
npm run dev