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

The*_*ing 3 python django unicode ascii nginx

我有奇怪的编码文件的列表:02 - Charlie, Woody and You?Study #22.mp3我想是没有那么糟糕,但也有它的Django nginx的OR似乎是受阻于一些特定的字符.

>>> test = u'02 - Charlie, Woody and You?Study #22.mp3'
>>> test
u'02 - Charlie, Woody and You\uff0fStudy #22.mp3'
Run Code Online (Sandbox Code Playgroud)

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

'path': smart_unicode(path.lstrip(MUSIC_PATH)),
'filename': smart_unicode(file)
Run Code Online (Sandbox Code Playgroud)

当我打印出他们确实展示的价值观时 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
Run Code Online (Sandbox Code Playgroud)

与大多数文件下载,但是当我到达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作为我的操作系统.

bob*_*nce 7

虽然这?是一个不寻常且不受欢迎的字符,但是对于任何非ASCII字符,您的脚本都会中断.

response['X-Accel-Redirect'] = url
Run Code Online (Sandbox Code Playgroud)

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

response['X-Accel-Redirect'] = url.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

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

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