// Пример для тестирования загрузки файлов import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import axios from 'axios'; import FormData from 'form-data'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // URL API const API_URL = 'http://localhost:3264/api'; /** * Загружает тестовый файл на сервер * @param {string} filePath - Путь к файлу для загрузки * @returns {Promise} - Результат загрузки файла */ async function uploadTestFile(filePath) { try { console.log(`Загрузка файла: ${filePath}`); if (!fs.existsSync(filePath)) { throw new Error(`Файл не найден: ${filePath}`); } // Создаем FormData для загрузки файла const formData = new FormData(); formData.append('file', fs.createReadStream(filePath)); // Отправляем запрос на загрузку const response = await axios.post(`${API_URL}/files/upload`, formData, { headers: { ...formData.getHeaders() }, maxContentLength: Infinity, maxBodyLength: Infinity }); console.log('Файл успешно загружен:'); console.log(JSON.stringify(response.data, null, 2)); return response.data; } catch (error) { console.error('Ошибка при загрузке файла:'); if (error.response) { console.error(error.response.data); } else { console.error(error.message); } throw error; } } /** * Получает STS токен напрямую (для тестирования) * @param {Object} fileInfo - Информация о файле * @returns {Promise} - Данные STS токена */ async function getTestStsToken(fileInfo) { try { console.log(`Запрос STS токена для файла: ${fileInfo.filename}`); const response = await axios.post(`${API_URL}/files/getstsToken`, fileInfo); console.log('Получен STS токен:'); console.log(JSON.stringify(response.data, null, 2)); return response.data; } catch (error) { console.error('Ошибка при получении STS токена:'); if (error.response) { console.error(error.response.data); } else { console.error(error.message); } throw error; } } /** * Напрямую загружает файл через OSS (для тестирования) * @param {string} filePath - Путь к файлу * @param {Object} stsData - Данные STS токена * @returns {Promise} - Результат загрузки */ async function directUploadFile(filePath, stsData) { try { console.log(`Прямая загрузка файла: ${filePath}`); if (!stsData || !stsData.file_url || !stsData.file_path) { throw new Error('Некорректные данные STS токена'); } // Загружаем ali-oss библиотеку динамически const OSS = (await import('ali-oss')).default; // Проверяем наличие необходимых данных для OSS if (!stsData.access_key_id || !stsData.access_key_secret || !stsData.security_token || !stsData.region || !stsData.bucketname) { throw new Error('Неполные данные STS токена для OSS'); } console.log(`Создание OSS клиента: регион ${stsData.region}, бакет ${stsData.bucketname}`); // Создаем клиент OSS с STS токеном const client = new OSS({ region: stsData.region, accessKeyId: stsData.access_key_id, accessKeySecret: stsData.access_key_secret, stsToken: stsData.security_token, bucket: stsData.bucketname, secure: true, // Используем HTTPS timeout: 60000 // 60 секунд таймаут }); // Получаем имя объекта из file_path const objectName = stsData.file_path; console.log(`Загрузка файла в OSS: ${objectName}`); // Загружаем файл const result = await client.put(objectName, filePath); console.log('Файл успешно загружен в OSS:'); console.log(`URL: ${stsData.file_url}`); console.log(`Ответ OSS: ${JSON.stringify(result)}`); // Проверяем, что файл действительно загружен try { const verifyResponse = await axios.get(stsData.file_url); console.log(`Файл успешно проверен, статус: ${verifyResponse.status}`); } catch (error) { console.log(`Не удалось проверить файл: ${error.message}`); // Это не критическая ошибка, так как файл может быть недоступен сразу } return { success: true, fileName: path.basename(filePath), url: stsData.file_url, fileId: stsData.file_id, ossResponse: result }; } catch (error) { console.error('Ошибка при загрузке файла в OSS:'); if (error.response) { console.error(`Статус: ${error.response.status}`); console.error(error.response.data); } else { console.error(error.message); } throw error; } } // Основная функция для запуска тестов async function runTest() { try { // Путь к тестовому файлу (например, изображение) const testFilePath = path.join(__dirname, 'test-image.jpg'); // Если файл не существует, создадим простой текстовый файл для теста if (!fs.existsSync(testFilePath)) { console.log('Тестовый файл не найден, создаем текстовый файл для теста...'); const textFilePath = path.join(__dirname, 'test-file.txt'); fs.writeFileSync(textFilePath, 'Это тестовый файл для загрузки.'); console.log(`Создан тестовый файл: ${textFilePath}`); // Тестируем получение STS токена const fileInfo = { filename: 'test-file.txt', filesize: fs.statSync(textFilePath).size, filetype: 'file' }; const stsData = await getTestStsToken(fileInfo); // Тестируем прямую загрузку файла console.log('\n--- Тестирование прямой загрузки файла ---'); await directUploadFile(textFilePath, stsData); // Тестируем загрузку через API console.log('\n--- Тестирование загрузки через API ---'); await uploadTestFile(textFilePath); } else { // Тестируем получение STS токена const fileInfo = { filename: 'test-image.jpg', filesize: fs.statSync(testFilePath).size, filetype: 'image' }; const stsData = await getTestStsToken(fileInfo); // Тестируем прямую загрузку файла console.log('\n--- Тестирование прямой загрузки файла ---'); await directUploadFile(testFilePath, stsData); // Тестируем загрузку через API console.log('\n--- Тестирование загрузки через API ---'); await uploadTestFile(testFilePath); } console.log('\nТестирование завершено успешно!'); } catch (error) { console.error('Ошибка при выполнении теста:', error.message); } } // Запускаем тест runTest();