【问题标题】:Upload and manipulate xml and image file in django在 django 中上传和操作 xml 和图像文件
【发布时间】:2021-09-30 07:27:17
【问题描述】:

此代码按预期返回类型错误 str、字节或 os.PathLike 对象,而不是 InMemoryUploadedFile 我不知道如何将用户数据以文件和图像的形式传递给我的 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 工作正常文件夹。

这里是回溯:

Traceback image

【问题讨论】:

  • 你能分享整个回溯吗?
  • 我已添加回溯图片
  • 下次尝试将回溯作为文本 :) 从它来看,search 正在接受路径,但您传递的文件仍在内存中。我不确定searchcreate 到底在做什么,所以我无法给出建议,但您要么必须先保存文件并获取路径,要么更改search 以使用内存中的文件而不是路径
  • 假设我的database 中有一个image 并且我想使用pillow 对其进行更改,但只有图像我selected 来自数据库那么我将如何设置pillow 的图像路径,尝试提供 image.url 并传递图像,但它对我不起作用,我不知道有任何其他方法可以做到这一点。我也尝试使用localhost:80000 + 图片网址
  • 不完全确定,也许更新你的标签并添加pillow,这样用过枕头的人可能会给你一些想法

标签: django django-models django-views django-forms django-templates


【解决方案1】:

pathlib.Path() 处理文件路径,而不是内存对象。 request.FILES 是附加到 POST 请求的数据。在处理 POST 请求期间,您可以验证此数据并决定将其保存到服务器磁盘。

如果您希望图像处理从服务器磁盘读取文件,则必须先保存新模型实例。然后,您可以通过模型的 ImageField 的name 属性访问磁盘上文件的路径,请参阅Using files in models

如果要在上传数据保存到磁盘之前对其进行处理,可以这样读取:

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

UploadedFile.read()

【讨论】:

    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2013-05-13
    相关资源
    最近更新 更多