Форма загрузки файлов на другой сервер без - PullRequest
0 голосов
/ 20 октября 2010

Как я могу отправить файл в django на другой сервер без перенаправления пользователя на сервер?Таким образом, все сводится к переписыванию этой простой функции php в django:

$filename = 'C:/tmp/myphoto.jpg';
$handler  = 'http://www.example.com/upload.php';
$field    = 'image';
$res = send_file($filename, $handler, $field);

if ($res) {
    echo 'done.';
} else {
    echo 'something went wrong.';
}

Функция на втором сервере - это просто функция php, которая читает файлы из $_FILES:

<?php
    move_uploaded_file(
        $_FILES['image']['tmp_name'],
        '/var/www/image/uploaded-file.jpg'
    );
    echo 'file saved.';
?>

I 'мы уже попробовали django-filetransfers , и это работает, но я почему-то не могу остаться на странице, с которой я загружаю файл.Я отредактировал представление upload_handler и файлы были отправлены правильно, но после этого я перенаправлен на мой второй сервер:

def upload_handler(request):
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
        return HttpResponseRedirect("/upload")

    upload_url, upload_data = prepare_upload(request, "address of my server/")
    form = UploadForm()
    return direct_to_template(request, '/upload.html',
        {'form': form, 'upload_url': upload_url, 'upload_data': upload_data,
         'uploads': UploadModel.objects.all()})

И вот мой подход.Я использую функции из httplib, а также функцию multipart_encode из python-poster, которая создает мне заголовки файлов:

def file_upload(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            f = request.FILES['file']
            logging.debug(f)
            status = send_file(request.FILES['file'])
            c = RequestContext(request, {
                "status" : status,
            })
            template = "management/status.html"
            result = render_to_string(template, c)
            return HttpResponse(result)
    else:
        form = UploadFileForm()
    return render_to_response('management/file_upload.html', {'form': form})


def send_file(file):
    datagen, headers = multipart_encode({"myfile": file})
    conn = httplib.HTTPConnection(HOST)
    conn.request('POST', '/rte/', file, headers)
    res = conn.getresponse()

    if res.status != 200:
        logging.debug("error \n")
        logging.debug(file)
        logging.debug("\n")
        logging.debug(headers)
    return res.status

HTML:

<form action="{{ views.file_upload }}" method="POST" enctype="multipart/form-data">
    {{ form.as_p }}
  <input type="submit" value="Upload" />
</form>

В результате я получаю «Ошибка 500»и в отладке:

2010-10-20 18:12:55,819 DEBUG thumb.php4.jpg
2010-10-20 18:14:55,968 DEBUG error 
2010-10-20 18:14:55,968 DEBUG thumb.php4.jpg
2010-10-20 18:14:55,969 DEBUG 
2010-10-20 18:14:55,969 DEBUG {'Content-Length': 15019, 'Content-Type': 'multipart/form-data; boundary=02cafbc1d080471284be55dc1095b399'}

Мои функции основаны на документах Python / Django и нескольких решениях, которые я нашел в Интернете.Функциональность выглядит так же, но как-то не работает.Должен ли я использовать другой подход?В php мне не нужно определять заголовки и т. Д.

1 Ответ

0 голосов
/ 21 октября 2010

Ну, во-первых, я хотел бы спросить, почему вы это делаете? Это из-за хранения или загрузки или, возможно, отработки отказа? Если это хранилище, почему вы отправляете файл на второй сервер по HTTP? Я предполагаю, что простая передача файла SSH была бы просто прекрасна ( scp ). В случае сбоя вам будет лучше использовать rsync .

Если использование собственного второго сервера не является обязательным, вы также можете воспользоваться услугой CDN.

...