Django:带有ASCII标头的Unicode文件名?

时间:2010-04-28 18:48:02

标签: python django unicode nginx ascii

我有一个奇怪编码的文件列表:02 - Charlie, Woody and You/Study #22.mp3我认为它并不是那么糟糕但是有一些特殊的字符,Django或者nginx似乎在试图抓住它们。

>>> test = u'02 - Charlie, Woody and You/Study #22.mp3'
>>> test
u'02 - Charlie, Woody and You\uff0fStudy #22.mp3'

我使用nginx作为反向代理连接到django内置的webserver(仍在开发阶段)和postgresql用于我的数据库。我的数据库和表都是en_US.UTF-8,我使用pgadmin3来查看django之外的表。我的问题有点超出了我的标题,首先我应该如何在我的数据库中保存可能很糟糕的文件名?我目前的方法是

'path': smart_unicode(path.lstrip(MUSIC_PATH)),
'filename': smart_unicode(file)

当我打印出值时,他们会显示u'whateverthecrap'

我不确定这是不是我应该这样做但是假设现在我有问题试图吐出下载。

我的下载视图如下所示:

def song_download(request, song_id):
    song = get_object_or_404(Song, pk=song_id)
    url = u'/static_music/%s/%s' % (song.path, song.filename)

    print url

    response = HttpResponse()
    response['X-Accel-Redirect'] = url
    response['Content-Type'] = 'audio/mpeg'
    response['Content-Disposition'] = "attachment; filename=test.mp3"

    return response

并且大多数文件都会下载,但是当我到达02 - Charlie, Woody and You/Study #22.mp3时,我会从django收到此邮件:'ascii' codec can't encode character u'\uff0f' in position 118: ordinal not in range(128), HTTP response headers must be in US-ASCII format

如果我的文件名超出范围,我如何使用ASCII可接受的字符串? 02 - Charlie, Woody and You\uff0fStudy #22.mp3似乎不起作用......

编辑1

我正在使用Ubuntu作为我的操作系统。

1 个答案:

答案 0 :(得分:7)

虽然是一个不寻常且不受欢迎的字符,但您的脚本会因任何非ASCII字符而中断。

response['X-Accel-Redirect'] = url

url是Unicode(它不是URL,它是文件路径)。响应头是字节。你需要对它进行编码。

response['X-Accel-Redirect'] = url.encode('utf-8')

假设您在使用UTF-8作为文件系统编码的服务器上运行。

(现在,如何对Content-Disposition标题中的文件名进行编码......这是一个相当棘手的问题!)