Form uploading files to different server without f

2019-09-13 15:46发布

How can I send a file in django to a different server without user being redirected to the server ? So all goes to rewriting this simple php function in 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.';
}

Function on the second server is just simple php func that reads files from $_FILES:

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

I've already tried django-filetransfers, and it works but I somehow cannot make it stay on the page from which I am uploading file. I have edited the upload_handler view and files are sent properly but after that I'm redirected to my second server :

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()})

And here's my approach. I'm using functions from httplib and also multipart_encode function from python-poster that creates me file headers :

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>

As a result I get 'Error 500' and in debug :

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'}

My functions are based on python/django docs and few solutions I've found on the internet. Functionality looks the same but somehow it doesn't work. Should I take different approach ? In php I do not need to define headers etc.

1条回答
在下西门庆
2楼-- · 2019-09-13 16:09

Well, first of all I'd like to ask why are you doing this? Is it because of the storage or load or perhaps failover? In case it's storage, why are you sending the file to the second server via HTTP? I guess a simple SSH file transfer would be just fine (scp). In case it's failover you'll be better off with rsync.

If using your own second server is not mandatory you might as well go with a CDN service.

查看更多
登录 后发表回答