沃梦达 / IT编程 / 前端开发 / 正文

vue.js云存储实现图片上传功能

下面是vue.js云存储实现图片上传功能的完整攻略,具体内容如下:

下面是"vue.js云存储实现图片上传功能"的完整攻略,具体内容如下:

1. 准备工作

在开始实现图片上传功能之前,我们需要进行以下准备工作:

1.1. 创建云存储账号

首先,我们需要去云存储厂商处创建一个账号。以阿里云为例,我们可以参考阿里云对象存储 OSS 快速入门文档进行操作。

1.2. 引入第三方工具库

在实现图片上传功能时,我们通常会使用一些第三方工具库,如:Axios, Uppy 等。要实现这些库的引入,我们需要使用 yarnnpm 包管理工具。

2. Vue.js 图片上传功能实现

我们可以使用 Uppy 提供的 @uppy/aws-s3 来实现 Vue.js 中的图片上传功能。具体操作如下:

2.1. 安装 uppy 和 aws-s3 插件

我们可以在终端中使用 yarnnpm 安装 uppyaws-s3

yarn add @uppy/core @uppy/aws-s3
# 或者
npm install @uppy/core @uppy/aws-s3 --save

2.2. 创建上传组件

下面是一个简单的 Vue.js 组件,它包含了 Uppy 的配置项和事件监听器:

<template>
  <div>
    <div id="drag-drop-area"></div>
    <div class="Dashboard-files"></div>
  </div>
</template>

<script>
import { Uppy } from '@uppy/core'
import AwsS3 from '@uppy/aws-s3'
import '@uppy/core/dist/style.css'
import '@uppy/dashboard/dist/style.css'

export default {
  name: 'Uploader',

  mounted() {
    const uppy = Uppy({
      id: 'drag-drop-area',
      autoProceed: false,
      allowMultipleUploads: true,
      debug: true,
      restrictions: {
        maxFileSize: 5 * 1024 * 1024,
        maxNumberOfFiles: null,
        minNumberOfFiles: null,
        allowedFileTypes: null
      }
    })

    uppy.use(AwsS3, {
      getUploadParameters (file) {
        // ...
      }
    })

    uppy.on('complete', (result) => {
      console.log('Upload completed with these files:', result.successful)
      // ...
    })

    uppy.on('upload-error', (file, error, response) => {
      console.log('Upload error:', error)
      // ...
    })
  }
}
</script>

当组件被挂载到 DOM 上之后,就会创建 Uppy 实例,同时我们也配置了云存储提供商的参数。在上述代码中,我们使用 AwsS3 代表我们的云存储提供商,且 getUploadParameters 函数会返回上传至云存储所需的必要参数。

2.3. 获取 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

我们需要去云提供商处获得 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY,以阿里云为例,我们可以参考阿里云对象存储 OSS 快速入门文档进行操作。

2.4. 填写上传参数

我们需要在 getUploadParameters 函数中,将步骤 2.3 中的 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 填写进去:

async getUploadParameters(file) {
  const { data } = await axios.get('http://localhost:3000/api/getUploadParams', {
    params: {
      filename: file.name,
      contentType: file.type
    }
  })
  return {
    method: 'PUT',
    url: data.url,
    fields: {
      'key': data.fields.key,
      'Content-Type': file.type,
      'x-amz-acl': 'public-read',
      'policy': data.fields.policy,
      'success_action_status': '201',
      'x-amz-signature': data.fields.signature,
      'x-amz-credential': data.fields.credential,
      'x-amz-date': data.fields.date
    }
  }
}

在上述代码中,我们向自己的服务器发出 HTTP 请求,以获取上传图片至云存储所需要的参数。然后将这些参数作为 getUploadParameters 函数的返回值,这些参数会被传递给云存储提供商的服务器,以便在服务端完成图片上传的功能。需要注意的是,上述代码中的 /api/getUploadParams 是服务器端的 HTTP 接口地址,可以根据自己的实际情况进行修改。

2.5. 创建后端接口

我们需要再后端搭建一个 HTTP 服务,用于接收 Uppy 组件的 HTTP 请求,并使用云存储参数完成图片上传功能。以 Node.js 为例,我们可以编写以下代码:

const express = require('express')
const cors = require('cors')
const AWS = require('aws-sdk')
const crypto = require('crypto')
const app = express()

AWS.config.update({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  region: 'oss-cn-beijing'
})

app.use(cors())

async function getS3Params(bucket, filename, contentType) {
  const randomHex = crypto.randomBytes(8).toString('hex')
  const key = `uploads/${randomHex}-${filename}`
  const s3Params = {
    Bucket: bucket,
    Key: key,
    Expires: 300,
    ContentType: contentType,
    ACL: 'public-read'
  }

  try {
    const data = await new Promise((resolve, reject) => {
      const s3 = new AWS.S3()
      s3.getSignedUrl('putObject', s3Params, (err, url) => {
        if (err) {
          console.error('Failed to sign S3 URL', err)
          reject(err)
        } else {
          const fields = {
            key,
            acl: 'public-read',
            policy: url.split('?')[1].split('&').filter(field => field.startsWith('Policy'))[0].split('=')[1],
            success_action_status: '201',
            'x-amz-algorithm': 'AWS4-HMAC-SHA256',
            'x-amz-credential': `${process.env.AWS_ACCESS_KEY_ID}/${new Date().toISOString().substr(0, 10)}/us-east-1/s3/aws4_request`,
            'x-amz-date': new Date().toISOString().replace(/[:\-]|\.\d{3}/g, ''),
            'x-amz-signature': url.split('?')[1].split('&').filter(field => field.startsWith('Signature'))[0].split('=')[1]
          }
          resolve({
            url,
            fields
          })
        }
      })
    })
    return data
  } catch (err) {
    console.error(err)
    return null
  }
}

app.get('/api/getUploadParams', async (req, res) => {
  const bucket = 'your-bucket-name'
  const filename = req.query.filename
  const contentType = req.query.contentType
  const s3Params = await getS3Params(bucket, filename, contentType)

  if (s3Params) {
    res.json(s3Params)
  } else {
    res.statusCode = 500
    res.send('Failed to get S3 upload parameters')
  }
})

app.listen(3000, () => {
  console.log('App listening on port 3000')
})

在上述代码中,我们使用了 aws-sdk 来完成图片上传的功能,getS3Params 函数会生成一个随机的文件名、并获取上传至云存储所需的必要参数。

需要注意的是,上述代码中的 process.env.AWS_ACCESS_KEY_IDprocess.env.AWS_SECRET_ACCESS_KEY 是我们在配合云提供商时,环境变量所对应的值,根据实际项目需求自行配置。

总结

在本文中,我们将通过 Vue.jsUppy 工具库,实现了图片上传至云存储的功能。同时,我们也介绍了如何配置 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY,以及在服务器端实现 HTTP 接口的细节。希望本篇攻略能对大家有所帮助。

本文标题为:vue.js云存储实现图片上传功能