私はここでいくつかの関連する質問を読みましたが、実際の解決策を見つけることはできませんでした。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
要求は正常ですので、これはサーバーである必要があります。質問は、私のために実行中のデバッグタスクのように見えます。いくつかのブレークポイント/デバッグ印刷をここに追加すると、間違ったコード行を特定することができます。 –
フラスコではサポートされていない方法で要求がファイル名をエンコードしますか? – mehdy