1

人々がファイルをアップロードできるようにするために使用されるサーバーがあります。残念ながら、私のスクリプトでは、ファイル名に空白を含むファイルをアップロードできます。これらのファイルへのリンクが(私のスクリプトによっても)生成されると、ファイル名はこれらの空のスペースで出力されます。これらのファイルは、私の 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()
4

1 に答える 1

0

アプリケーションは、空白を処理できる必要があります。

ブラウザーで、空白を に変更します%20。例:

http://foo.bar/my%20cat.jpg

my%20cat は見栄えが悪いかもしれませんが、その場合、次を_使用して空白をアンダースコア ( )に置き換えることができます。

filename.replace(new RegExp(find, ' '), '_');

Python スクリプトの場合、 を次のように置き換えますurllib.request.urlretrive....

urllib.request.urlretrieve(urllib.quote(url + '\' + name))

追加することを忘れないでくださいimport urllib.quote

于 2014-06-26T07:48:06.137 に答える