2015-11-15 8 views
10

私はここでいくつかの関連する質問を読みましたが、実際の解決策を見つけることはできませんでした。unicodeのファイル名を持つpython-requests投稿

私はこの単純化されたコードでフラスコサーバーを持っている:

app = Flask(__name__) 
api = Api(app) 


class SendMailAPI(Resource): 
    def post(self): 
     print request.files 
     return Response(status=200) 

api.add_resource(SendMailAPI, '/') 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', debug=True) 

次に、クライアントに:

# coding:utf-8 

import requests 

eng_file_name = 'a.txt' 
heb_file_name = u'א.txt' 

requests.post('http://localhost:5000/', files={'file0': open(eng_file_name, 'rb')}) 
requests.post('http://localhost:5000/', files={'file0': open(heb_file_name, 'rb')}) 

サーバが受信した非UTF-8ファイル名の最初の要求を送信しますファイルを要求してImmutableMultiDict([('file0', <FileStorage: u'a.txt' (None)>)])を印刷しますが、utf-8ファイル名でファイルを送信すると、サーバはファイルを受信して​​いないように見えるので、ImmutableMultiDict([])を印刷します。

私は要求2.3.0を使用していますが、問題は同様に(2.8.1)の最新バージョンでは解決しない、フラスコのバージョンは0.10.1、フラスコ、RESTfulなバージョンが0.3.4です。

私はrequestsコードで掘り下げましたが、リクエストはok(つまりファイルで)送信されたようですが、送信される直前にリクエストを印刷して、ファイル名が実際にRFC2231にエンコードされていることを確認します。問題が適切にリクエストにファイルを添付していないか、Flaskあればあるファイル名を持つファイルを拾って問題を抱えていることrequests内にある場合

--6ea257530b254861b71626f10a801726 
Content-Disposition: form-data; name="file0"; filename*=utf-8''%D7%90.txt 

は、私は完全にわからないんだけど、物事をまとめるために、 RFC2231に従って符号化される。

UPDATE:requests GitHubの中でこの問題に出くわした:https://github.com/kennethreitz/requests/issues/2505

+0

要求は正常ですので、これはサーバーである必要があります。質問は、私のために実行中のデバッグタスクのように見えます。いくつかのブレークポイント/デバッグ印刷をここに追加すると、間違ったコード行を特定することができます。 –

+0

フラスコではサポートされていない方法で要求がファイル名をエンコードしますか? – mehdy

答えて

1

私は手動でread()でファイルを読み込み、その内容を掲載することにより、この問題を回避:

requests.post(upload_url, files={ 
    'file': ("photo.jpg", open(path_with_unicode_filename, 'rb').read()) 
}) 
2

私は多分混乱があると思いますここにエンコードしてここに -

eng_file_name = 'a.txt' # ASCII encoded, by default in Python 2 
heb_file_name = u'א.txt' # NOT UTF-8 Encoded - just a unicode object 

あなたは何を見ていない - 私はそれはしかし、ファイルを開こうとすると、クライアント上のエラーをスローしないことを少し驚いている

requests.post('http://localhost:5000/', files={'file0': open(heb_file_name.encode('utf-8'), 'rb')}) 

:あなたが何をしたいか、サーバーに2つ目の1を送信するには、このですエラーを示すクライアント側で?

編集:自分のアイデアを確認または拒否する簡単な方法は、もちろん、クライアント内からコンテンツを印刷して、正しく読み取られるようにすることです。

関連する問題