2013-11-16 2 views
0

Я пытаюсь загрузить изображения из папки носителя, когда пользователь нажимает на некоторых кнопках загрузки изображенияфайлов загрузка изображений через Джанго

from django.core.servers.basehttp import FileWrapper 
import mimetypes 
import settings 
import os 

@login_required 
def download_image(request, product_id): 
    # current_site = get_current_site(request) 
    product_image = Product.objects.get(object_id=product_id) 
    product_image_url = product_image.product_image_url() 
    print product_image_url,">>>>>>>>>>>>>>" 
    wrapper = FileWrapper(open(product_image_url, 'rb')) 
    print wrapper,">>>>>>>>>>>>>>>>>" 
    content_type = mimetypes.guess_type(product_image_url)[0] 
    response = HttpResponse(wrapper, mimetype=content_type) 
    response['Content-Disposition'] = "attachment; filename=%s" % product_image_url 
    return response 

Из приведенного выше точек зрения я могу иметь возможность получить путь к изображению, но получает следующее ошибка

/media/product/product4959e24a4edf4f8d8afa8c529f3afaff/codes/image_dr_130.png >>>>>>>>>>>>>>>>

Traceback (most recent call last): 
    File "/home/user/Envs/comp/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 115, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "/home/user/Envs/comp/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
    File "/home/user/name/cpmp/comp/projsite/apps/website/views.py", line 963, in download_image 
    wrapper = FileWrapper(open(product_image_url, 'rb')) 
IOError: [Errno 2] No such file or directory: '/media/product/product4959e24a4edf4f8d8afa8c529f3afaff/codes/image_dr_130.png' 

так я получаю правильный путь к изображению, и Whe n Я вошел в путь изображения, как localhost:8000/media/product/product4959e24a4edf4f8d8afa8c529f3afaff/codes/image_dr_130.png Я могу видеть изображение в браузере, так почему я получаю вышеуказанную ошибку?

Update

settings.py

ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 

def ABS_PATH(*args): 
    return os.path.join(ROOT_DIR, *args) 

# Example: "/home/media/media.lawrence.com/media/" 
MEDIA_ROOT = ABS_PATH('media') 

# URL that handles the media served from MEDIA_ROOT. Make sure to use a 
# trailing slash. 
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" 
MEDIA_URL = '/media/' 

ответ

1

Я сомневаюсь, что медиа в /media папке, это означает, что ссылка localhost:8000/<path> не относятся к файлу <path> в файловой системе. Тем не менее, вы пытаетесь получить доступ к своему имени файла по URL-адресу.

Судя по тому, что Django успешно поставляет URL, и, как я предполагаю, что вы используете django.core.context_processors.media контекста процессора, чтобы доставить ваши средства массовой информации, вы можете попробовать предварять MEDIA_ROOT относительного пути к URL, удаляя MEDIAL_URL часть из него.

То есть, если ваши настройки

MEDIA_ROOT = '/path/to/django/media/' 
MEDIA_URL = '/media/' 

вы должны найти файл, расположенный на /path/to/django/media/product/product4959e24a4edf4f8d8afa8c529f3afaff/codes/image_dr_130.png

+0

Я обновил мои настройки выше на самом деле –

+0

использования 'ABS_PATH (product_image.product_image_url())' – alko

+0

благодарит и решает это, как показано ниже –

1

решенных в следующей манере

@login_required 
def download_image(request, product_id): 
    # current_site = get_current_site(request) 
    product_image = Product.objects.get(object_id=product_id) 
    product_image_url = product_image.product_image_url() 
    wrapper = FileWrapper(open(settings.MEDIA_ROOT+ product_image_url[6:], 'rb')) 
    content_type = mimetypes.guess_type(product_image_url)[0] 
    response = HttpResponse(wrapper, mimetype=content_type) 
    response['Content-Disposition'] = "attachment; filename=%s" % product_image_url 
    return response 
Смежные вопросы