UNPKG

share-files-tool

Version:

A simple file sharing application.

143 lines (119 loc) 5.2 kB
const express = require('express'); const multer = require('multer'); const path = require('path'); const fs = require('fs'); const { getSuccessHtml, getPreviewHtml, getFileListHtml } = require('../utils/htmlTemplates'); const qr = require('qr-image'); var ipUrl; function setupRoutes(app, uploadsDir, clipboardPath, dirname__, ) { const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, uploadsDir); }, filename: (req, file, cb) => { const originalName = file.originalname; const ext = path.extname(originalName); const nameWithoutExt = path.basename(originalName, ext); let newFileName = originalName; if (fs.existsSync(path.join(uploadsDir, newFileName))) { const creationDate = new Date(); const formattedDate = `${creationDate.getMonth() + 1}${creationDate.getDate()}${creationDate.getFullYear()}${creationDate.getHours().toString().padStart(2, '0')}${creationDate.getMinutes().toString().padStart(2, '0')}${creationDate.getSeconds().toString().padStart(2, '0')}`; newFileName = `${nameWithoutExt}_${formattedDate}${ext}`; } cb(null, newFileName); } }); const upload = multer({ storage: storage }); app.use(express.static('public')); app.use('/uploads', express.static(uploadsDir)); app.get('/', (req, res) => { res.sendFile(path.join(dirname__, '../public', 'index.html')); }); app.post('/upload', upload.array('files'), (req, res) => { res.send(getSuccessHtml()); }); app.get('/upload-success', (req, res) => { res.send(getSuccessHtml()); }); app.get('/download/:filename', (req, res) => { const filePath = path.join(uploadsDir, req.params.filename); fs.access(filePath, fs.constants.R_OK, (err) => { if (err) { return res.status(404).send('File not found or cannot be accessed.'); } res.download(filePath, (err) => { if (err) { console.error('Error downloading file:', err); res.status(500).send('Could not download file.'); } }); }); }); app.get('/delete/:filename', (req, res) => { const filePath = path.join(uploadsDir, req.params.filename); fs.unlink(filePath, (err) => { if (err) { return res.status(500).send(`Can't delete the file. ${err}`); } res.redirect('/list-downloads'); }); }); app.get('/preview/:filename', (req, res) => { const filename = req.params.filename; const filePath = path.join(uploadsDir, filename); const fileUrl = `${ipUrl}/uploads/${filename}`; if (!fs.existsSync(filePath)) { return res.status(404).send('File not found'); } if (filename.endsWith('.jpg') || filename.endsWith('.png') || filename.endsWith('.jpeg') || filename.endsWith('.gif')) { res.send(getPreviewHtml('image', fileUrl, filename)); } else if (filename.endsWith('.mp4') || filename.endsWith('.webm') || filename.endsWith('.ogg')) { res.send(getPreviewHtml('video', fileUrl, filename)); } else if (filename.endsWith('.pdf')) { res.send(getPreviewHtml('pdf', fileUrl, filename)); } else if (filename.endsWith('.txt')) { res.send(getPreviewHtml('txt', fileUrl, filename)); } else { res.send(getPreviewHtml('none', fileUrl, filename)); } }); app.get('/list-downloads', (req, res) => { fs.readdir(uploadsDir, (err, files) => { if (err) { return res.status(500).send('Unable to read download folder'); } res.send(getFileListHtml(files, uploadsDir)); }); }); app.post('/shareClipboard', (req, res) => { try { const content = req.body && req.body.content; fs.writeFileSync(clipboardPath, content || "", 'utf8'); res.json({ message: 'shared: ' + content, content }); } catch (error) { res.status(500).json({ message: 'Failed to read clipboard contents:', error }); } }); app.get('/getClipboard', (req, res) => { const content = fs.readFileSync(clipboardPath, 'utf8'); res.json({ content: content || "" }); }); app.post('/clearClipboard', (req, res) => { fs.writeFileSync(clipboardPath, '', 'utf8'); res.json({ message: 'cleared clipboard' }); }); app.get('/qrcode', async (req, res) => { try { const qrCodeImage = qr.imageSync(ipUrl, { type: 'png' }); const base64QRImage = Buffer.from(qrCodeImage).toString('base64'); const dataUrl = `data:image/png;base64,${base64QRImage}`; res.send(dataUrl); } catch (err) { res.status(500).send('An error occurred while generating the QR code'); } }); } function setIpUrl(url) { ipUrl = url; } module.exports = { setupRoutes, setIpUrl };