Files
XCDesktop/remote/test-file-api.js

269 lines
8.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const http = require('http');
const https = require('https');
const BASE_URL = 'http://localhost:3000';
const PASSWORD = 'wzw20040525';
const CHUNK_SIZE = 5 * 1024 * 1024;
function request(options, body = null) {
return new Promise((resolve, reject) => {
const url = new URL(options.path, BASE_URL);
url.searchParams.set('password', PASSWORD);
const client = url.protocol === 'https:' ? https : http;
const reqOptions = {
hostname: url.hostname,
port: url.port,
path: url.pathname + url.search,
method: options.method,
headers: options.headers || {}
};
const req = client.request(reqOptions, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
try {
resolve({ status: res.statusCode, data: JSON.parse(data) });
} catch {
resolve({ status: res.statusCode, data });
}
});
});
req.on('error', reject);
if (body) {
if (body instanceof FormData) {
req.write(body.getBuffer());
} else if (Buffer.isBuffer(body)) {
req.write(body);
} else {
req.write(JSON.stringify(body));
}
}
req.end();
});
}
async function testGetDrives() {
console.log('\n=== 测试1: 获取驱动器列表 ===');
try {
const driveUrl = new URL('/api/files/browse', BASE_URL);
driveUrl.searchParams.set('allowSystem', 'true');
driveUrl.searchParams.set('password', PASSWORD);
const res = await request({
method: 'GET',
path: driveUrl.pathname + driveUrl.search
});
console.log('状态:', res.status);
console.log('currentPath:', res.data.currentPath);
console.log('parentPath:', res.data.parentPath);
// 检查是否返回了驱动器(盘符如 C:, D:
const drives = res.data.items?.filter(item => item.name.match(/^[A-Z]:$/i));
if (drives && drives.length > 0) {
console.log('✓ 驱动器列表:', drives.map(d => d.name).join(', '));
return true;
}
// 如果返回的是目录列表而非驱动器,说明 allowSystem 未生效
console.log('✗ 未获取到驱动器列表');
console.log('返回的项目:', res.data.items?.slice(0, 5).map(i => i.name).join(', '));
return false;
} catch (err) {
console.error('错误:', err.message);
return false;
}
}
async function testUploadToSystemDir() {
console.log('\n=== 测试2: 上传到系统目录 ===');
const testContent = 'Hello Remote System Directory Test ' + Date.now();
const filename = 'D:\\xc_test_file.txt';
try {
// 1. 开始上传
console.log('1. 开始上传...');
const startUrl = new URL('/api/files/upload/start', BASE_URL);
startUrl.searchParams.set('password', PASSWORD);
const startRes = await new Promise((resolve, reject) => {
const req = http.request({
hostname: startUrl.hostname,
port: startUrl.port,
path: startUrl.pathname + startUrl.search,
method: 'POST',
headers: { 'Content-Type': 'application/json' }
}, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
try { resolve({ status: res.statusCode, data: JSON.parse(data) }); }
catch { resolve({ status: res.statusCode, data }); }
});
});
req.on('error', reject);
req.write(JSON.stringify({
filename: filename,
totalChunks: 1,
fileSize: Buffer.byteLength(testContent)
}));
req.end();
});
console.log('开始上传响应:', startRes.data);
if (!startRes.data.fileId) {
console.error('未获取到fileId');
return false;
}
const fileId = startRes.data.fileId;
// 2. 上传分块
console.log('2. 上传分块...');
const chunk = Buffer.from(testContent);
const chunkUrl = new URL('/api/files/upload/chunk', BASE_URL);
chunkUrl.searchParams.set('password', PASSWORD);
const FormData = require('form-data');
const form = new FormData();
form.append('fileId', fileId);
form.append('chunkIndex', '0');
form.append('chunk', chunk, { filename: 'chunk', contentType: 'application/octet-stream' });
const chunkRes = await new Promise((resolve, reject) => {
const req = http.request({
hostname: chunkUrl.hostname,
port: chunkUrl.port,
path: chunkUrl.pathname + chunkUrl.search,
method: 'POST',
headers: form.getHeaders()
}, (res) => {
let data = '';
res.on('data', c => data += c);
res.on('end', () => {
try { resolve({ status: res.statusCode, data: JSON.parse(data) }); }
catch { resolve({ status: res.statusCode, data }); }
});
});
req.on('error', reject);
req.write(form.getBuffer());
req.end();
});
console.log('分块上传响应:', chunkRes.data);
// 3. 合并文件
console.log('3. 合并文件...');
const mergeUrl = new URL('/api/files/upload/merge', BASE_URL);
mergeUrl.searchParams.set('password', PASSWORD);
const mergeRes = await new Promise((resolve, reject) => {
const req = http.request({
hostname: mergeUrl.hostname,
port: mergeUrl.port,
path: mergeUrl.pathname + mergeUrl.search,
method: 'POST',
headers: { 'Content-Type': 'application/json' }
}, (res) => {
let data = '';
res.on('data', c => data += c);
res.on('end', () => {
try { resolve({ status: res.statusCode, data: JSON.parse(data) }); }
catch { resolve({ status: res.statusCode, data }); }
});
});
req.on('error', reject);
req.write(JSON.stringify({
fileId: fileId,
totalChunks: 1,
filename: filename
}));
req.end();
});
console.log('合并响应:', mergeRes.data);
return mergeRes.data.success === true;
} catch (err) {
console.error('错误:', err.message);
return false;
}
}
async function testDownloadFromSystemDir() {
console.log('\n=== 测试3: 从系统目录下载 ===');
const filename = 'D:\\xc_test_file.txt';
try {
const encodedPath = encodeURIComponent(filename);
const res = await request({
method: 'GET',
path: `/api/files/${encodedPath}`
});
console.log('状态:', res.status);
console.log('响应类型:', typeof res.data);
return res.status === 200;
} catch (err) {
console.error('错误:', err.message);
return false;
}
}
async function testDeleteFile() {
console.log('\n=== 测试4: 删除测试文件 ===');
const filename = 'D:\\xc_test_file.txt';
try {
const encodedPath = encodeURIComponent(filename);
const res = await request({
method: 'DELETE',
path: `/api/files/${encodedPath}`
});
console.log('状态:', res.status);
console.log('响应:', res.data);
return res.data.success === true || res.status === 200;
} catch (err) {
console.error('错误:', err.message);
return false;
}
}
async function main() {
console.log('========================================');
console.log('远程文件传输功能测试');
console.log('目标服务器: 146.56.248.142:8080');
console.log('========================================');
const results = [];
// 测试1: 获取驱动器列表
results.push({ name: '获取驱动器列表', pass: await testGetDrives() });
// 测试2: 上传到系统目录
results.push({ name: '上传到系统目录', pass: await testUploadToSystemDir() });
// 测试3: 从系统目录下载
results.push({ name: '从系统目录下载', pass: await testDownloadFromSystemDir() });
// 测试4: 删除测试文件
results.push({ name: '删除测试文件', pass: await testDeleteFile() });
// 汇总结果
console.log('\n========================================');
console.log('测试结果汇总:');
console.log('========================================');
results.forEach(r => {
console.log(`${r.pass ? '✓' : '✗'} ${r.name}`);
});
const allPass = results.every(r => r.pass);
console.log(`\n总体结果: ${allPass ? '全部通过' : '存在失败'}`);
process.exit(allPass ? 0 : 1);
}
main();