2

fileuploadを含むDjangoフォームがあります。ビューで、urllibpostリクエストを使用してこのファイルを別のサーバーに渡したいと思います。

このファイルをこのような通常の投稿変数に入れてみました。

最初のサーバーのviews.py:

def loadfile(request):
    server_url = "foo"

    class UploadFileForm(forms.Form):
        filename = forms.FileField()
    context['fileform'] = UploadFileForm()

    #after button is pressed
    if request.method == 'POST':
        upload_file(context, server_url, request.FILES['filename'])

    return render_to_response("bar")

def upload_file(context, server_url, image_data):
    #create a temp file to store image on sever
    temp = tempfile.NamedTemporaryFile()
    for chunk in image_data.chunks():
        temp.write(chunk)
    temp.flush()

    #build filename
    origfilename = str(image_data)
    extention = origfilename[origfilename.rfind("."):]
    filename = uuid.uuid4().hex + extention            

    #encode image so it can be send
    with open(temp.name, "rb") as f:
        data = f.read()
        encoded_string = base64.urlsafe_b64encode(data)
        url = "http://" + server_url + "/uploadimage?filename=" + filename
        urllib2.urlopen(url, "img_data="+encoded_string)
    temp.close()

これは、ダウンスチームサーバーがdjangoテストサーバーでもある場合に機能しますが、nginx / uwsgiを使用すると、「不正なゲートウェイ」エラーが発生します。これは、uwsgiのバッファサイズが小さすぎるためだと思います。したがって、解決策は、適切なマルチパートPOSTリクエストを作成することです。

問題は、django fileuploadリクエストを指定して、マルチパートurllibリクエストを簡単に作成する方法です。

4

1 に答える 1

6

リクエストライブラリを使用します。

url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
于 2012-11-09T12:26:32.277 に答える