Загрузка и управление xml-файлами и файлами изображений в django

#django #django-models #django-views #django-forms #django-templates

Вопрос:

Этот код возвращает ошибку типа, как и ожидалось, str, байты или ос.Объект, похожий на путь, а не в загруженном файле. Я не знаю, как передать пользовательские данные в виде файла и изображения в мой code.py файл для внесения изменений в оригинал.

views.py

 def home(request):
new_image = None
file = None
form = ScanForm()
if request.method == 'POST':
    form = ScanForm(request.POST, request.FILES)
    if form.is_valid():
        image = request.FILES['image']
        xml_file = request.FILES['xml_file']
        new_image = code.create(image, code.search(
            xml_file)[0], code.search(xml_file)[1])
        form.save()

        return render(request, 'app/home.html', {'form': form, 'new_image': new_image})
    else:
        form = ScanForm()
return render(request, 'app/home.html', {'form': form, 'new_image': new_image})
 
печать изображения и xml_file успешно распечатывают их имена

forms.py

 class ScanForm(forms.ModelForm):
class Meta:
    model = Scan
    fields = '__all__'
 

models.py

 class Scan(models.Model):
image = models.ImageField(upload_to='images')
xml_file = models.FileField(upload_to='files')
processed_at = models.DateTimeField(auto_now_add=True)
description = models.CharField(max_length=500, null=True)

class Meta:
    ordering = ['-processed_at']

def __str__(self):
    return self.description
 
Вот код для манипулирования изображением в соответствии с данными в xml

code.py

 def search(path):
new = []
object_names = []
object_values = []

txt = Path(path).read_text()
txt.strip()
names = et.fromstring(txt).findall('object')
for i in names:
    object_names.append(i[0].text)
values = et.fromstring(txt).findall('object/bndbox')
for i in values:
    for j in i:
        object_values.append(int(j.text))

return object_names, object_values


def create(image, object_names, object_values):
img = cv.imread(image)
on = len(object_names)
ov = len(object_values)
for i in list(range(0, ov, on)):
    cv.rectangle(img, (object_values[i], object_values[i 1]),
                 (object_values[i 2], object_values[i 3]), (0, 0, 255), thickness=5)
return img
 
Это code.py работает нормально, если протестировано путем передачи данных вручную с помощью локальной папки.

Вот обратная связь:

Обратное изображение

Комментарии:

1. Можете ли вы поделиться всей обратной связью?

2. Я добавил изображение обратной связи

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

4. предположим, у меня есть image в моей database , и я хочу изменить его, используя pillow , но только изображение у меня selected из базы данных как бы я установить изображение в путь pillow , он попытался дать образ.URL-адреса и передает изображение, но это не сработало для меня, и я не знаю других способов сделать это. Также я попытался использовать localhost:80000 URL-адрес изображения

5. Не совсем уверен, может быть, обновите свои теги и добавьте pillow , чтобы люди, которые использовали pillow, могли дать вам идеи

Ответ №1:

pathlib.Path() обрабатывает пути к файлам, а не объекты памяти. request.FILES являются данными, приложенными к почтовому запросу. Во время обработки запроса POST вы можете проверить эти данные и принять решение сохранить их на диске сервера.

Если вы хотите, чтобы ваша обработка изображений считывала файл с диска сервера, сначала вам необходимо сохранить экземпляр новой модели. Затем вы можете получить доступ к пути к файлу на диске через name атрибут поля изображения модели, см. раздел Использование файлов в моделях.

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

 txt = request.FILES["xml_file"].read()
 

Смотрите Загруженный файл.прочитайте()