filesharing/server.js
2022-08-26 20:46:06 +08:00

75 lines
2.6 KiB
JavaScript

const { SERVER_HOST, SERVER_PORT, MONGODB_URL, TEMP_PATH, SAVE_PATH, UPLOAD_SIZE_LIMIT } = require('./config')
const fs = require('fs')
const path = require('path')
const multer = require('multer')
const bcrypt = require('bcrypt')
const md5file = require('md5-file')
const express = require('express')
const mongoose = require('mongoose')
const File = require('./models/File')
mongoose.connect(MONGODB_URL, (error) => {
if (error) {
console.error(error)
} else {
console.info('mongodb connected successfully')
}
})
const app = express()
app.set('view engine', 'pug')
app.use(express.static('public'))
app.use(express.urlencoded({ extended: true }))
app.use(express.json())
app.get('/', (req, res) => {
res.render('upload')
})
const upload = multer({ dest: TEMP_PATH, limits: { fileSize: UPLOAD_SIZE_LIMIT } })
app.post('/upload', upload.single('file'), async (req, res) => {
const file_temp_path = path.join(TEMP_PATH, req.file.filename)
const md5 = await md5file(file_temp_path)
const file_save_path = path.join(__dirname, SAVE_PATH, md5)
if (!fs.existsSync(file_save_path)) {
fs.cpSync(file_temp_path, file_save_path) // 复制文件到UPLOAD_PATH
}
fs.unlinkSync(file_temp_path) // 删除临时文件
let file = {
md5,
size: req.file.size,
encoding: req.file.encoding,
mimetype: req.file.mimetype,
// 解决了multer将中文文件名错误编码的问题
filename: Buffer.from(req.file.originalname, 'latin1').toString('utf8'),
password: req.body.password ? await bcrypt.hash(req.body.password, 16) : '',
}
// 写入数据库
console.log(req.file)
console.log(file)
const fileshare = new File(file)
file = await fileshare.save()
console.log(file)
res.status(201).render('upload', { file })
})
app.get('/file/:id', async (req, res) => {
const file = await File.findById(req.params.id)
if (file) {
res.render('download', { file })
} else {
res.sendStatus(404)
}
})
app.post('/file/:id', async (req, res) => {
const file = await File.findById(req.params.id)
if (file) {
if (file.password == '' || (await bcrypt.compare(req.body.password, file.password)) == true) {
await file.update({ $inc: { downloads: 1 } })
res.status(200).download(path.join(SAVE_PATH, file.md5), file.filename)
} else {
res.sendStatus(401)
}
} else {
res.sendStatus(404)
}
})
const server = app.listen(SERVER_PORT, SERVER_HOST, () => {
console.info(`server is running at http://${SERVER_HOST}:${SERVER_PORT}`)
})