Программное сохранение изображения в Django ImageField - PullRequest
186 голосов
/ 20 августа 2009

Хорошо, я попробовал почти все и не могу заставить это работать.

  • У меня есть модель Django с ImageField на ней
  • У меня есть код, который загружает изображение через HTTP (проверено и работает)
  • Изображение сохраняется непосредственно в папку upload_to (закачка - та, которая установлена ​​в ImageField)
  • Все, что мне нужно сделать, это связать уже существующий путь к файлу изображения с ImageField

Я написал этот код о 6 разных способах.

Проблема, с которой я сталкиваюсь, заключается в том, что весь код, который я пишу, приводит к следующему поведению: (1) Django создаст второй файл, (2) переименует новый файл, добавив _ в конец имени файла, затем (3) не перенесет никаких данных, оставив его в основном пустым переименованным файлом. В пути «upload_to» осталось 2 файла, один из которых является фактическим изображением, а другой - именем изображения, но пустым, и, конечно, путь ImageField установлен на пустой файл, который пытается создать Django. .

Если это неясно, я попытаюсь проиллюстрировать:

## Image generation code runs.... 
/Upload
     generated_image.jpg     4kb

## Attempt to set the ImageField path...
/Upload
     generated_image.jpg     4kb
     generated_image_.jpg    0kb

ImageField.Path = /Upload/generated_image_.jpg

Как я могу сделать это, не пытаясь Django повторно сохранить файл? Что мне действительно нравится, так это что-то в этом роде ...

model.ImageField.path = generated_image_path

... но, конечно, это не работает.

И да, я рассмотрел другие вопросы, такие как этот , а также документ django по File

UPDATE После дальнейшего тестирования, это происходит только при работе под Apache на Windows Server. Во время работы под «runserver» на XP он не выполняет это поведение.

Я в тупике.

Вот код, который успешно работает на XP ...

f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()

Ответы [ 14 ]

1 голос
/ 13 января 2013
class tweet_photos(models.Model):
upload_path='absolute path'
image=models.ImageField(upload_to=upload_path)
image_url = models.URLField(null=True, blank=True)
def save(self, *args, **kwargs):
    if self.image_url:
        import urllib, os
        from urlparse import urlparse
        file_save_dir = self.upload_path
        filename = urlparse(self.image_url).path.split('/')[-1]
        urllib.urlretrieve(self.image_url, os.path.join(file_save_dir, filename))
        self.image = os.path.join(file_save_dir, filename)
        self.image_url = ''
    super(tweet_photos, self).save()
1 голос
/ 24 апреля 2011

Вы можете попробовать:

model.ImageField.path = os.path.join('/Upload', generated_image_path)
0 голосов
/ 15 августа 2018

Рабочая! Вы можете сохранить изображение с помощью FileSystemStorage. проверьте пример ниже

def upload_pic(request):
if request.method == 'POST' and request.FILES['photo']:
    photo = request.FILES['photo']
    name = request.FILES['photo'].name
    fs = FileSystemStorage()
##### you can update file saving location too by adding line below #####
    fs.base_location = fs.base_location+'/company_coverphotos'
##################
    filename = fs.save(name, photo)
    uploaded_file_url = fs.url(filename)+'/company_coverphotos'
    Profile.objects.filter(user=request.user).update(photo=photo)
0 голосов
/ 17 ноября 2017

Вы можете использовать Django REST framework и python Запросы библиотеки для программного сохранения изображения в Django ImageField

Вот пример:

import requests


def upload_image():
    # PATH TO DJANGO REST API
    url = "http://127.0.0.1:8080/api/gallery/"

    # MODEL FIELDS DATA
    data = {'first_name': "Rajiv", 'last_name': "Sharma"}

    #  UPLOAD FILES THROUGH REST API
    photo = open('/path/to/photo'), 'rb')
    resume = open('/path/to/resume'), 'rb')
    files = {'photo': photo, 'resume': resume}

    request = requests.post(url, data=data, files=files)
    print(request.status_code, request.reason) 
...