日本語ファイルのダウンロード

閲覧: 302 回
最初の未読メッセージにスキップ

くまきちさん

未読、
2009/02/22 12:27:522009/02/22
To: Google-App-Engine-Japan
こんばんは。

日本語ファイルをダウンロードする処理を教えてください。
self.response.headers['Content-type'] = str( mimetype )
_fname = file_data.name.encode( 'utf-8' )
_fname = urllib.quote( _fname )
self.response.headers['Content-disposition'] = 'attachment;filename='
+ _fname
としているのですがブラウザーにより動作が異なります。
・IE6
 日本語ファイルがダウンロードできる
・FireFox
 %~とエンコードされたファイル名が表示されます。
 そこで、quoteをはずすと、Content-dispositionヘッダーが送られてきません

Launcherでは日本語ファイルがダウンロードできていたので、チェックが漏れてしまいました。(- -;

よろしくお願いします。

Takashi Matsuo

未読、
2009/02/22 12:41:022009/02/22
To: google-app-...@googlegroups.com
松尾です。

http://cydn.cybozu.co.jp/office/2008/07/
ここの「日本語ファイル名の悩み」を見ると悩んでいる人は多いみたいですね。
RFC2231 が鍵でしょうか。

また下記のページにも対処方法がまとめてありますね。
http://fgin.seesaa.net/article/30073826.html

User-Agent によって処理を変える必要があるかもしれません。
頑張ってください!

Happy coding :-)

-- Takashi Matsuo



2009/2/23 くまきちさん <t.kum...@gmail.com>:

くまきち

未読、
2009/02/23 6:44:132009/02/23
To: google-app-...@googlegroups.com
くまきちです。

松尾さん、ありがとうございます。

IEとFireFoxは対処できました。

_fname = file_data.name.encode( 'iso-2022-jp' )


_fname = urllib.quote( _fname )

_ww = "attachment;filename*=iso-2022-jp'ja'" + _fname
self.response.headers['Content-disposition'] = _ww

こんな感じです。
あとは、Safariです・・・(^ ^;

くまきち

未読、
2009/02/24 11:29:202009/02/24
To: google-app-...@googlegroups.com
くまきちです。

Safariにめげています(- -;

Content-dispositionではファイル名を指定できないんですね。。
PATH_INFOで指定しなきゃならない・・で、ここから・・

1.PATH_INFOを書き換えられないか?
os.environ['PATH_INFO'] = ファイル名
ではNG。。
self.response.headers['PATH_INFO']ではPATH_INFOが無いよ!って言われました。
続いて・・・
self.request.environ[ "PATH_INFO" ] = ファイル名
その後で、
self.request.environ[ "PATH_INFO" ]
とやったところ、見事に書き換えられていました。で、勢い込んで、ダウンロード
したところ・・・やっぱりファイル名が「DownFile」となっていました。。
ここで挫折。。。

2.URIにファイル名を含める
<a href="/DownFile/{{list.ename}}?key={{list.key}}" />Down</a />
な感じでファイル名を設定。
application = webapp.WSGIApplication([
('/DownFile/([^/]+)', DownFile),
], debug=True)
な感じで、ハンドラを設定。
で結果は・・・
イメージファイル以外(.xls/.ppt/.doc/.txt/.html)ならダウンロードできました。
でも、.jpgや.gifなんかだと
The requested URL /DownFile/11_image1.gif?key=agtnb25zdHJndGV was not
found on this server.
とのこと。。

とりあえずは、Safariは挫折。
情報お持ちの方は、ご教授くださいm(_ _)m

Takeshi

未読、
2009/02/26 21:58:482009/02/26
To: Google-App-Engine-Japan
参考までに。

Google App Engine Oil を使ってファイルマネージャっぽいものを作ってるのですが、日本語名のファイルが扱えるようになりまし
た。

1. ルーティングの設定をmain.pyに追加
-------------------
def initRoutes():
r = router.Router()
#TODO: add routes here
r.connect('/:controller/:action/:id')
r.connect('/files/
feed/:id/:filename.:suffix',controller='files',action='feed')
r.connect('/files/
feed/:id/:filename',controller='files',action='feed')
------------------
:filename,:suffixはURLに日本語ファイル名を埋め込むためだけの目的でcontrollerでは使用していません。


モデル:
-----------------
from google.appengine.ext import db
from gaeo.model import BaseModel, SearchableBaseModel
import jst
import urllib
class File(BaseModel):
filename = db.StringProperty()
content_type = db.StringProperty(default='application/octet-stream')
body = db.BlobProperty()
uploaded_at = db.DateTimeProperty(auto_now_add = True)
def quoted_filename(self):
return urllib.quote(self.filename.encode('utf-8'))
-------------------

コントローラ:
---------------------
class FilesController(BaseController):
def feed(self):
id = self.params['id']
file = File.get_by_id(int(id))
self.render(binary=file.body,content_type=str
(file.content_type))
# binaryというパラメータは自分でソースをいじって追加。
---------------------
ファイル名ではなく、idからデータを取得しています。

テンプレート:
-------------------------------
{% block content %}
<table width="100%">
<tr>
<th></th>
<th>ID</th>
<th>ファイル名</th>
<th>種類</th>
<th>登録日</th>
<th>パス</th>
</tr>
{% for file in files %}
<tr>
<td><input type="checkbox"></td>
<td>{{file.key.id}}</td>
<td><a href="/files/feed/{{file.key.id}}/
{{file.quoted_filename}}" target="_file">{{file.filename}}</a></td>
<td>{{file.content_type}}</td>
<td>{{file.uploaded_at|date:"Y/m/d H:s"}}</td>
<td><input type="text" value="/files/feed/{{ file.key.id }}/
{{file.quoted_filename}}" ></td>
</tr>
{% endfor %}
-----------------------
HTMLにはurllib.quoteでエンコードされたファイル名が埋め込まれています。

firefox,safari(mac osx)で動作を確認しました。

--
ふじさわ
全員に返信
投稿者に返信
転送
新着メール 0 件