Как сохранить изображение с помощью django imageField? - PullRequest
7 голосов
/ 11 января 2012

публикация из приложения (iOS android и т. Д.), А не веб-форма.

class someImage(models.Model):
    image = models.ImageField(upload_to= settings.SHARE_IMAGE_UPLOAD_PATH)

@csrf_exempt
def saveImage(request):

Как написать представление?он получает изображение в почтовом запросе.Каждая вещь, которую я нахожу, связана с формой (сервер новичок)

Ответы [ 2 ]

15 голосов
/ 11 января 2012

Если вы не используете реальную HTML-форму для отправки данных, это не значит, что вы не можете использовать ModelForm для обработки запроса:

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed
from django.utils import simplejson

def upload_view(request):
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            result = {'success': True}
            return HttpResponse(simplejson.dumps(result), mimetype='application/json')
        else:
            return HttpResponseBadRequest()
    else:
       return HttpResponseNotAllowed(['POST'])
4 голосов
/ 11 января 2012

Изменить: Пожалуйста, используйте ответ, выбранный выше - приведенный ниже код работает на вопрос, но не рекомендуется.

Файл изображения, который вы загружаете, находится в:

request.FILES['image'] # assuming input name is called 'image'

Он не возвращает вам объект Image, а скорее объект UploadedFile. Вы можете прочитать эту часть документации (я предполагаю, что вы используете Django 1.3.x): https://docs.djangoproject.com/en/1.3/topics/http/file-uploads/#handling-uploaded-files

Он охватывает поля и методы, доступные в объекте UploadedFile, а также общий способ ручной загрузки файлов. Вы можете использовать тот же метод, чтобы записать файл изображения в файл объекта и затем сохранить его в свой ImageField.

Следующий код должен работать, но это не безопасный код. Я предполагаю, что вы используете * nix машину, если нет, сохраните файл назначения в другом месте.

@csrf_exempt
def saveImage(request):
    # warning, code might not be safe
    up_file = request.FILES['image']
    destination = open('/tmp/' + up_file.name , 'wb+')
    for chunk in up_file.chunks():
        destination.write(chunk)
    destination.close()
    img = someImage()
    img.image.save(up_file.name, File(open('/tmp/' + up_file.name, 'r')))
    img.save()
    # return any response you want after this

Другие замечания: убедитесь, что форма имеет следующий атрибут для работы:

 <form enctype="multipart/form-data" ... >

Я не помню, чтобы это использование было нормальным, но на самом деле рекомендуется использовать формы.

...