我正在使用Django 1.7和Python 3.4 .
我有一个像这样的模型:
class ImageModel(models.Model):
image = models.ImageField(verbose_name='image', upload_to='uploaded_images/')
现在我想下载保存在/ static / uploaded_images /中的图像 . 例如,我有一个这样的链接: www.example.com/image/download/1
,其中1是ImageModel对象的id .
现在我有一个观点:
def download_image(request, image_id):
img = ImageModel.objects.get(id=image_id)
( what I need to do? )
接下来是什么?如何创建一个强制下载该图像的视图?
6 回答
您可以尝试此代码,可能需要一些注意事项:
我假设您的
ImageModel
中有一个字段.name
来获取倒数第二行中的文件名...filename=%s" % img.name
您应该编辑代码以适合您的项目 .ImageField 中有一个字段
file
,在这里的代码中我使用img.file
获取文件的路径,您应该更改img.YOUR_IMAGE_FIELD.file
或获取图像路径所需的任何内容你需要使用
Content-Disposition
Headers ,看看这里:Generating file to download with Django
Django Serving a Download File
另外两个答案还可以,但是出于性能原因,不推荐使用Django来提供静态文件 . 最好使用您的Web服务器(nginx / apache ...)来提供它 .
您不需要额外的视图来提供静态文件 . 只需在模板中呈现指向该文件的链接:
object
是ImageModel
的一个实例 .见django.db.models.fields.files.FieldFile.url
如果你真的想在像
www.example.com/image/download/1
这样的URL中有一个视图,你可以简单地写一个重定向到从该字段获得的图像URL的视图 .基于类的视图类型示例就像这样(我使用python-magic来获取文件的正确内容类型):
这适用于Django 1.10.7,但Django 1.7不应该有所不同
这是您的跨浏览器安全下载包含任何字符类型的文件
它不起作用 . 我做了这样的事情:
其中
img
指向我的ImageField
字段 . 文件已下载,但我可以't open it. xUbuntu image viewer seys '不是JPEG文件 . 以0x89 0x50'开头