人々がファイルをアップロードできるようにするために使用されるサーバーがあります。残念ながら、私のスクリプトでは、ファイル名に空白を含むファイルをアップロードできます。これらのファイルへのリンクが(私のスクリプトによっても)生成されると、ファイル名はこれらの空のスペースで出力されます。これらのファイルは、私の Python スクリプト (これも添付されています) ではダウンロードできません。私の質問は明らかに、この問題を解決する最善の方法です。それが次のことであるかどうかはわかりません:
A: ある種の正規表現を使用して、アップロード時にファイル名を変更するか、または
B:サーバー上の実際のファイル名を参照できる方法がある場合(sshすると、正しいファイルパスに実際にスペースが含まれているように見えるため、わかりません)。
この問題の最善の解決策は何かに非常に興味があります。ありがとう。
ここに私のサーバーコードがあります:
var http = require('http'),
url = require('url'),
util = require('util'),
path = require('path'),
fs = require('fs'),
qs = require('querystring');
var formidable = require('formidable'),
mime = require('mime');
function dirTree(filename) {
var stats = fs.lstatSync(filename),
info = {
name: path.basename(filename),
path: ip + ':' + port + '/uploads/finished/' + path.basename(filename),
type: mime.lookup(filename).substring(0, 5)
};
if (stats.isDirectory()) {
info.type = "folder";
info.children = fs.readdirSync(filename).map(function (child) {
return dirTree(filename + '/' + child);
});
}
return info;
}
http.createServer(function (request, response) {
if (request.method.toLowerCase() == 'get') {
var filePath = './content' + request.url;
if (filePath == './content/') {
filePath = './content/home.html';
}
if (filePath == './content/feed') {
var a = dirTree('./content/uploads/finished');
response.end(JSON.stringify(a));
}
var extname = path.extname(filePath);
var contentType = mime.lookup(extname);
fs.exists(filePath, function (exists) {
if (exists) {
fs.readFile(filePath, function (error, content) {
if (error) {
response.writeHead(500);
response.end();
}
else {
response.writeHead(200, {'Content-Type': contentType});
response.end(content, 'utf-8');
}
})
} else {
response.writeHead(404);
response.end();
}
});
}
var form = new formidable.IncomingForm;
if (request.url == '/upload') {
var oldPath,
newPath,
fileName;
form.uploadDir = './content/uploads/temp/';
form.keepExtensions = true;
form.parse(request, function (err, fields, files) {
type = files['upload']['type'];
fileName = files['upload']['name'];
oldPath = files['upload']['path'];
newPath = './content/uploads/finished/' + fileName;
});
form.on('end', function () {
fs.rename(oldPath, newPath, function (err) {
if (err) {
response.end('There was an error with your request');
console.log('error')
} else {
response.end('<h1>Thanks for uploading ' + fileName + '<h1>');
}
});
});
}
}).listen(port);
問題が発生している Python ダウンロード スクリプトを次に示します。
import json
import urllib.request
url = '192.241.228.76:9090'
def test():
response = urllib.request.urlopen('http://192.241.228.76:9090/feed')
readd = response.read()
data = json.loads(readd.decode(response.info().get_param('charset', 'utf8')))
if "children" in data:
for i in range(len(data['children'])):
kind = data['children'][i]['type']
url = 'http://' + data['children'][i]['path']
name = 'media/' + data['children'][i]['name']
if kind in ('video', 'image'):
try:
urllib.request.urlretrieve(url, name)
except:
try:
print('Spaces in ' + url)
except:
print('weird in file name')
test()