vue3上传文件到数据库并点击连接打开文件
时间: 2023-08-14 20:04:10 浏览: 95
基于springboot、mybatis-plus、vue前后端分离
要将文件上传到数据库并允许用户通过链接打开文件,您需要执行以下步骤:
1. 前端实现文件上传:使用 Vue3 和 Element Plus 实现文件上传,您可以按照上一个问题的步骤来完成。
2. 后端实现文件上传:在后端,您需要处理文件上传请求,将文件存储在数据库中,并返回文件的 ID 或链接。以下是一个 Node.js Express 后端示例:
```
const express = require('express');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
const { createReadStream } = require('fs');
const { join } = require('path');
const { v4: uuidv4 } = require('uuid');
const mysql = require('mysql');
const app = express();
const port = 3000;
const db = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydb'
});
db.connect((err) => {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + db.threadId);
});
app.post('/upload', upload.single('file'), (req, res) => {
const id = uuidv4();
const { originalname, mimetype, size } = req.file;
const filePath = join(__dirname, req.file.path);
const fileStream = createReadStream(filePath);
const query = 'INSERT INTO files (id, name, type, size, data) VALUES (?, ?, ?, ?, ?)';
db.query(query, [id, originalname, mimetype, size, fileStream], (err, result) => {
if (err) {
console.error(err);
res.status(500).send('Internal server error');
return;
}
res.json({ id });
});
});
app.get('/files/:id', (req, res) => {
const { id } = req.params;
const query = 'SELECT name, type, size, data FROM files WHERE id = ?';
db.query(query, [id], (err, result) => {
if (err) {
console.error(err);
res.status(500).send('Internal server error');
return;
}
const { name, type, size, data } = result[0];
res.set({
'Content-Disposition': `attachment; filename="${name}"`,
'Content-Type': type,
'Content-Length': size
});
data.pipe(res);
});
});
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
```
在上面的代码中,我们使用 multer 处理文件上传请求,生成唯一的文件 ID,将文件存储在数据库中,然后返回文件 ID。我们还实现了一个 GET /files/:id 路由,该路由接受文件 ID,并返回文件的名称、类型、大小和数据流。
3. 前端实现文件下载:在前端,您需要获取文件 ID 并使用链接将文件下载到本地。以下是一个示例:
```
<template>
<div>
<el-upload
ref="upload"
:action="uploadUrl"
:on-success="handleUploadSuccess"
:show-file-list="false">
<el-button slot="trigger" size="small" type="primary">上传文件</el-button>
</el-upload>
<el-button type="primary" v-if="downloadUrl" @click="downloadFile">下载文件</el-button>
</div>
</template>
<script>
export default {
data() {
return {
uploadUrl: '/upload',
downloadUrl: ''
};
},
methods: {
handleUploadSuccess(response) {
this.downloadUrl = `/files/${response.id}`;
},
downloadFile() {
const link = document.createElement('a');
link.href = this.downloadUrl;
link.download = 'file.txt';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}
}
</script>
```
在上面的代码中,我们实现了一个文件上传组件,并通过 `handleUploadSuccess` 方法获取文件 ID。当用户单击“下载文件”按钮时,我们创建一个链接并将链接指向文件的 URL,然后使用 `link.click()` 方法触发链接的下载操作。
希望这些步骤能帮助您将文件上传到数据库并允许用户打开文件的链接。
阅读全文