如何在django中提供可下载的图像文件

时间:2013-10-25 18:53:14

标签: python django image media

我将所有图像存储在项目中的某些文件夹中,例如媒体,我在html模板中有一个按钮,可以下载相应的图像。

以下是我的代码

views.py

@login_required
def download_image(request, product_id):
    import os
    # current_site = get_current_site(request)
    product_image =  Product.objects.get(id=product_id)
    product_image_url = product_image.image_code_url()
    print product_image_url, ">>>>>>>>>>>>>>>"
    response = HttpResponse(mimetype='application/force-download')
    response['X-Sendfile'] = smart_str(product_image_url)
    response['Content-Length'] = os.stat(product_image_url).st_size

    return response  

template.html

<input type=button><a href="{% url 'download_image' product_id%}"></a>/>

结果

/media/productb7ab/product792f2764314f40b8bd3b3d58290765cc/codes/Image_1.png  >>>>>>>>>>>>>>>
ERROR 2013-10-25 18:46:21,192 (base) (7258, -1248855232): Internal Server Error: /download/code/88/
Traceback (most recent call last):
  .......
  .......
  OSError: [Errno 2] No such file or directory: '/media/productb7ab/product792f2764314f40b8bd3b3d58290765cc/codes/Image_1.png'

但是当我点击localhost:8000/media/productb7ab/product792f2764314f40b8bd3b3d58290765cc/codes/Image_1.png这样的网址时,我可以查看图片,

最后如何从django中的文件系统下载图像?

我在上面的代码中做错了什么?

修改

阅读Brandon

分享的建议链接后

我已经将上面的方法修改为以下代码,但我面临的错误仍然是

来自django.core.servers.basehttp导入FileWrapper

@login_required
def downloadimage(request, product_id):
    import os
    # current_site = get_current_site(request)
    image_code =  Product.objects.get(object_id=product_id)
    image_code_url = image_code.image_code_url()
    print image_code_url,">>>>>>>>>>>>>>"
    wrapper = FileWrapper(file(image_code_url))
    response = HttpResponse(wrapper, content_type='text/plain')
    response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(image_code_url)
    response['Content-Length'] = os.path.getsize(image_code_url)
    return response

错误

Error:IOError at /download/code/88/
[Errno 2] No such file or directory: '/media/productrbab/product792f2764314f40b8bd3b3d58290765cc/codes/Image_1.png'
Request Method: GET
Request URL:    http://localhost:8000/download/qrcode/88/
Django Version: 1.5.4
Exception Type: IOError
Exception Value:    
[Errno 2] No such file or directory: '/media/productrbab/product792f2764314f40b8bd3b3d58290765cc/codes/Image_1.png'

1 个答案:

答案 0 :(得分:1)

为什么不在上一个视图中设置网址:

image_url = Product.objects.get(...).image_code_url()

然后在模板中添加一个普通链接:

<a href="{{ image_url }}">Download</a>

注意:在更大的系统中通过Django提供文件会导致效率低下 - 通过简单的HTTP服务器(Apache或Nginx)更好地为它们服务。有关django docs中媒体管理的更多信息。