2016-07-23 3 views
0

ダウンロード可能なファイルをアップロードするようにユーザーに促すアプリを開発しています。ここ は、ダウンロードハンドラである:「クロムやIEを使用している間GAE Python Blobstoreは、FirefoxでUnicodeリテラルを含むファイル名を保存しません。

class ViewPrezentacje(blobstore_handlers.BlobstoreDownloadHandler, BaseHandler): 
    def get(self,blob_key): 
     blob_key = str(urllib.unquote(blob_key)) 
     blob_info=blobstore.BlobInfo.get(blob_key) 
     self.send_blob(blob_info, save_as=urllib.quote(blob_info.filename.encode('utf-8'))) 

ファイルは(つまり、ユニコードリテラルが正しく表示されます)正しいファイル名でダウンロードされますが、Firefoxでは、それは形式の文字列として保存されます%83%86%E3 ... " Firefoxで正しく動作させる方法はありますか?

+0

はあまりにも、dev_appserverと同じ動作存在するか修正するまで、今のUnicodeのファイル名を持つにあきらめますか?私はこのバグのためにblobstoreでエンコードの問題も経験しました。 https://code.google.com/p/googleappengine/issues/detail?id=2749 – cdagli

+0

私はこのバグにも同じ問題がありました。私はフォームデータをajaxとファイルを介してアップロードファイル形式で送信することで回避しました。それぞれが異なるハンドラをトリガしていました(明らかにblobstoreハンドラはajaxやwebフォームを送信する手段に関係なくUnicodeリテラルを適切にエンコードしません)。ただし、ファイル名の問題は、dev appserverでも発生します。 –

答えて

1

添付ファイルにASCII以外の文字が含まれているファイル名を送信すると、元の仕様が壊れていてブラウザの動作が変更されているため、困難が伴います。

ファイル名を%-encoding(urllib.quote)にしないでください。 Firefoxは結果としてリテラル%シーケンスとしてそれを提供するのが正しいです。たとえChromeが最終的にそれをコピーしたにもかかわらず、ファイル名内の% - 復号シーケンスのIEの動作は間違っています。

最終的には非ASCIIファイル名を送信するための正しい方法は次のようになりヘッダーで終わりRFC6266で指定されたメカニズムを使用することです:

Content-Disposition: attachment; filename*=UTF-8''foo-%c3%a4-%e2%82%ac.html 

しかし:

  • 古いですIE8などのブラウザはそれをサポートしていないので気にするなら何かをASCII専用のとして渡す必要があります。
  • BlobstoreDownloadHandlerはこのメカニズムについて認識していません。

    def send_attachment(filename): 
        if isinstance(filename, unicode): 
        filename = filename.encode('utf-8') 
        self.response.headers['Content-Disposition'] = (
         _CONTENT_DISPOSITION_FORMAT % filename) 
    

    本当にやりたい:

    rfc6266_filename = "UTF-8''" + urllib.quote(filename.encode('utf-8')) 
    fallback_filename = filename.encode('us-ascii', 'ignore') 
    self.response.headers['Content-Disposition'] = 'attachment; filename="%s"; filename*=%s' % (rfc6266_filename, fallback_filename) 
    

    を残念ながら、内側の関数であることがにそれは迷惑になり

固定を必要とするBlobstoreDownloadHandlerのビットはsend_blobで、この内側の関数でありますサブクラスで修正しようとします。あなたは可能性:

  • オーバーライドはsend_blobの全体がsend_attachment内部機能
  • を交換するか、多分あなたはsend_blobを呼び出した後、このようなself.response.headers['Content-Disposition']を書き込むことができますか?私はGAEはこの
  • または、すべてのおそらく最も実用的にどのように処理するかわからないんだけど、GAEはそれが
関連する問題