我正在使用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? )
下一步是什么?如何创建一个视图来强制下载该图像?
7条答案
按热度按时间rdlzhqv91#
你可以试试这段代码,也许需要一些注意事项:
1.我假设在
ImageModel
中有一个字段.name
,用于获取倒数第二行...filename=%s" % img.name
中的文件名。1.在***ImageField***中有一个字段是
file
,在这里的代码中,我使用img.file
来获取文件的路径,您应该为img.YOUR_IMAGE_FIELD.file
或任何需要获取图像路径的内容更改该字段thigvfpy2#
你需要使用
Content-Disposition
头文件,看看这里:Generating file to download with Django
Django Serving a Download File
qyuhtwio3#
一个基于类的views-type的例子是这样的(我使用python-magic来获取文件的正确内容类型):
这适用于Django 1.10.7,但对于Django 1.7应该没有什么不同
pexxcrt24#
其他两个答案是可以的,但正如许多地方所宣传的那样,出于性能原因,不建议使用Django来提供静态文件。最好使用您的Web服务器(nginx/apache...)来提供它。
您不需要额外的视图来提供静态文件。只需在模板中呈现指向该文件的链接:
其中
object
是ImageModel
的示例。参见django.db.models.fields.files.FieldFile.url
如果你真的想在像
www.example.com/image/download/1
这样的URL中有一个视图,你可以简单地写一个视图,重定向到从字段中获得的图像URL。vs91vp4v5#
这段代码在新版本的Django中运行良好:
将field_name更改为字段。字段必须是ImageField或FileField。
ibrsph3r6#
这里是您的跨浏览器安全下载的文件包含任何字符类型
y3bcpkx17#
它不起作用。我做了这样的事情:
其中
img
指向我的ImageField
字段。文件已下载,但我无法打开它。xUbuntu图像查看器会显示“Not a JPEG file. starts with 0x89 0x50”