2

I have all the images stored at some folder like media in my project, and i have a button in html template that should download the respective image.

Below are my codes

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>/>

result :

/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'

But when i hit the url like localhost:8000/media/productb7ab/product792f2764314f40b8bd3b3d58290765cc/codes/Image_1.png , i can able to view the image,

so finally how to download an image from the filesystem in django ?

What am i doing wrong in my above code ?

Edit

After reading the suggested link shared by Brandon

I have modified my above method to below code and still the same errors i am facing

from django.core.servers.basehttp import 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

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'
Shiva Krishna Bavandla
  • 25,548
  • 75
  • 193
  • 313

1 Answers1

1

Why don't you set url in the previous view:

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

and then just put a normal link in your template:

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

Note: serving files via Django in bigger systems will lead to inefficiency - better serve them via simple HTTP server (Apache or Nginx). More on media management in django docs.

Wojciech Ptak
  • 683
  • 4
  • 14
  • may be that is right, but when we given like so if a user clicks on download he will see an image only in the browser right, but what i am looking for the funcionlaity is i need to download immediately when i clicked on the download button – Shiva Krishna Bavandla Oct 26 '13 at 03:47
  • Because as of now i am showing the image to the user already and below that image html element, i want to give the user an option of downloading the image to this system directly when he clicks on download..... so this is what i am looking for – Shiva Krishna Bavandla Oct 26 '13 at 03:49