Teammasik

server.js

May 22nd, 2026 (edited)
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // server.js
  2.  
  3. const express = require('express');
  4. const AWS = require('aws-sdk');
  5. const cors = require('cors');
  6. const path = require('path');
  7.  
  8. const app = express();
  9. const PORT = 3000;
  10.  
  11. app.use(cors());
  12. app.use(express.json());
  13. app.use(express.static(__dirname));
  14.  
  15. const s3 = new AWS.S3({
  16.   endpoint: 'https://storage.yandexcloud.net',
  17.   accessKeyId: 'YCAJEHtdePFC8MCfONmONK5Tz',
  18.   secretAccessKey: 'YCML7eke-Wy3YoXG9gHWbRRbQjq5fNq3ZE38EXMG',
  19.   region: 'ru-central1',
  20.   signatureVersion: 'v4'
  21. });
  22.  
  23. const BUCKET_NAME = 'test-bucket-supa-unique';
  24.  
  25. app.post('/upload', (req, res) => {
  26.     const { fileName } = req.body;
  27.  
  28.     if (!fileName) {
  29.         return res.status(400).json({ error: 'fileName is required' });
  30.     }
  31.  
  32.     const cleanFileName = fileName.replace(/[^a-zA-Z0-9._-]/g, '_');
  33.  
  34.     const params = {
  35.         Bucket: BUCKET_NAME,
  36.         Key: cleanFileName,
  37.         Expires: 120,
  38.         ContentType: 'application/octet-stream',
  39.     };
  40.  
  41.     try {
  42.         const uploadUrl = s3.getSignedUrl('putObject', params);
  43.        
  44.         console.log(`Сгенерирован URL для загрузки: ${cleanFileName}`);
  45.        
  46.         res.json({
  47.             success: true,
  48.             uploadUrl: uploadUrl,
  49.             fileName: cleanFileName,
  50.             expiresIn: '2 minutes'
  51.         });
  52.     } catch (error) {
  53.         console.error('Error generating upload URL:', error);
  54.         res.status(500).json({
  55.             error: 'Failed to generate upload URL',
  56.             details: error.message
  57.         });
  58.     }
  59. });
  60.  
  61. app.get('/download/:fileName', (req, res) => {
  62.     const { fileName } = req.params;
  63.  
  64.     const params = {
  65.         Bucket: BUCKET_NAME,
  66.         Key: fileName,
  67.         Expires: 60
  68.     };
  69.  
  70.     try {
  71.         const downloadUrl = s3.getSignedUrl('getObject', params);
  72.         console.log(`Сгенерирован URL для скачивания: ${fileName}`);
  73.         res.redirect(303, downloadUrl);
  74.     } catch (error) {
  75.         console.error('Error generating download URL:', error);
  76.         res.status(500).json({ error: 'Failed to generate download URL' });
  77.     }
  78. });
  79.  
  80. app.get('/list', async (req, res) => {
  81.     try {
  82.         const response = await s3.listObjectsV2({ Bucket: BUCKET_NAME }).promise();
  83.         const files = response.Contents.map(item => ({
  84.             name: item.Key,
  85.             size: item.Size,
  86.             lastModified: item.LastModified
  87.         }));
  88.        
  89.         console.log(`Список файлов: ${files.length} файлов`);
  90.         res.json({ files });
  91.     } catch (error) {
  92.         console.error('Error listing files:', error);
  93.         res.status(500).json({
  94.             error: 'Failed to list files',
  95.             details: error.message
  96.         });
  97.     }
  98. });
  99.  
  100. app.get('/health', async (req, res) => {
  101.     try {
  102.         await s3.headBucket({ Bucket: BUCKET_NAME }).promise();
  103.         res.json({ status: 'OK', bucket: BUCKET_NAME });
  104.     } catch (error) {
  105.         res.status(500).json({ status: 'ERROR', error: error.message });
  106.     }
  107. });
  108.  
  109. app.get('/', (req, res) => {
  110.     res.sendFile(path.join(__dirname, 'index.html'));
  111. });
  112.  
  113. app.listen(PORT, () => {
  114.     console.log(`
  115.         Откройте: http://localhost:${PORT}
  116.     `);
  117. });
Advertisement
Add Comment
Please, Sign In to add comment