当前位置: 首页 > 知识库问答 >
问题:

HTML表单不想发送图像

幸阳波
2023-03-14

我有一个复杂的任务,现在我不知道为什么事情不能正常工作。

所以我有两个服务——我的Django主服务器和OCR服务。OCR服务是用FastAPI构建的,它只获取图像,对图像进行处理,并以JSON的形式返回来自图像的数据。这就是我的fastapi文件的样子:

from fastapi import FastAPI, File, UploadFile, Request

import celery_launch
from cleaning_folders import cleaning_folder
from config import save_img_from_form


f_app = FastAPI()

def save_img_from_form(image):
    ts = time.time() * 1000
    digit = random.randint(0, 9)
    file_name = "img_{digit}_{ts}.jpg".format(digit=digit, ts=ts)
    with open(os.path.join('temp_img', file_name), 'wb') as buffer:
        shutil.copyfileobj(image.file, buffer)
    return buffer

@f_app.post("/api/ocr")
async def send_request(image: UploadFile = File(default='Any', media_type='multipart/form-data')):
    buffer = save_img_from_form(image)

    response = celery_launch.ocr_process(
            selected_town='Templates/Chernomorsk',
            raw_img_path=buffer.name,
            selected_billing_type=1
        )

        json_response = response.get()

        cleaning_folder('temp_img')
        return json_response

所以 save_img_from_form() 从请求中获取一个图像对象并将其保存到磁盘以供下次处理。然后芹菜运行并执行所有 OCR 过程,然后返回一个字典。

因此,当我使用Swagger UI作为交互式API测试服务时,一切都正常,所以在Swagger UI中,我可以通过html输入加载我的图像,然后单击按钮运行我的endpoint。然后我得到了正确的JSON作为响应。我还检查了网络活动(Chrome中的ctrl shift I)和链接到我的endpoint的网络动作,我看到了很多关于我的请求的东西,还有表单数据(图片ofc)。

但另一个问题是。我需要在我的Django服务器上加载一个图像,然后使用请求库将该文件的请求发送到FastAPI服务。但在这里,我遇到了很多麻烦。我有这样一个html表单:

<form method="POST" action="{% url 'send_ocr_form' %}" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="hidden" name="pk" value="{{pk}}">
        <input type="file" id="ocr_image" name="ocr_image" accept=".jpg, .jpeg"><br>
        <button type="submit">Recognize</button>
</form>

一些服务人员需要name=“pk”的隐藏字段。因此,为了加载图像,我有一个名为“ocr_image”的字段。

我对此表单的看法是:

def send_ocr_bill_form(request):
    image = request.FILES['ocr_image'].temporary_file_path()

    ocr_response = send_ocr_bill(image=image)
    files = {'file': open(image, 'rb')}
    ocr_response = requests.post('http://127.0.0.1:5005/api/ocr', files=files)
    print(ocr_response.json())

    return redirect(request.META.get('HTTP_REFERER', '/accounts/profile_page/'))

这并不是这个视图的全部功能,它只是因为当前的问题而没有结束。

因此,当我用image FastAPI发送表单时,使用default='Any '作为图像变量,这意味着请求中没有文件。当我检查网络时,我也没有在我的请求中看到“表单数据”块。所以看起来我不发送图像。但是在我看来,我可以很容易地从请求中获取并打印一个对象。文件,看到它的名字和临时路径,这意味着我加载图像并在我的请求中发送它。

还有有趣的事实。当我删除我的文件输入,只留下csrf令牌和pk隐藏输入,然后提交表单时,在我的网络请求中,我可以看到表单数据,然后在视图中获得我的“pk”。但当我返回文件输入时,表单数据块会消失。

共有1个答案

孙明德
2023-03-14

花了这么多时间来解决这个问题,答案是那么容易。我的失败是请求库。让我们看看我的FastAPI的endpoint第一个字符串:

async def send_request(image: UploadFile = File(default='Any', media_type='multipart/form-data')):

所以我将“image”定义为UploadFile对象,当然我的endpoint会在请求中等待文件,但当我在Django视图中发送图像时,我会这样做:

files = {'file': open(image, 'rb')}
ocr_response = requests.post('http://127.0.0.1:5005/api/ocr', files=files)

所以,在“files”变量中,我还使用“file”键将图像分配给它。我需要改变的是:

files = {'image': open(image, 'rb')}
ocr_response = requests.post('http://127.0.0.1:5005/api/ocr', files=files)

现在,当FastAPIendpoint收到请求时,它从正确的位置获取图像参数,然后我可以用它做所有的事情。

 类似资料:
  • 问题内容: 当前设置 我有这样的HTML表单。 我可能在页面上有很多这些表格。 我的问题 如何异步提交此表单,而不进行重定向或刷新页面?我知道怎么用。我遇到的问题是从javascript中的HTML检索数据,然后将其放入发布请求字符串中。这是我当前用于zXMLHttpRequest的方法。 例如,假设单击了表单的“提交”按钮时调用了javascript方法,那么如何从该方法访问表单的值并将其添加到

  • 问题内容: 所以我有这个HTML表单: 当用户单击“提交”时,哪种形式最简单的方法将此表单的数据作为JSON对象发送到我的服务器? 更新:我已经走了这么远,但似乎没有用: 我究竟做错了什么? 问题答案: 获取完整的表单数据作为数组,并对其进行json字符串化。 您可以稍后在ajax中使用它。或者,如果您不使用ajax;将其放在隐藏的文本区域中并传递到服务器。如果此数据通过常规格式数据作为json字

  • 问题内容: 我有一个供人们填写的HTML表单,所以我想要它,因此当他们单击“提交”按钮时,它将仅发送电子邮件,而不显示他们的电子邮件并要求他们自己发送消息。 当我使用时: 所有要做的就是打开一个新窗口,并填充电子邮件的正文,但是我希望它仅发送电子邮件。 有没有一种方法可以格式化电子邮件的输出格式?不仅是字段名称和输入值的列表。 谢谢。 问题答案: 实际上,我现在使用ASP C#发送电子邮件,内容类

  • 本文向大家介绍设置以HTML提交表单时将表单数据发送到何处?,包括了设置以HTML提交表单时将表单数据发送到何处?的使用技巧和注意事项,需要的朋友参考一下 使用HTML中的formaction 属性来设置以HTML提交表单时将表单数据发送到的位置。 示例 您可以尝试运行以下代码以实现formaction 属性-

  • 问题内容: 我有这样的表格: 我想异步发送这些数据,使用jQuery函数。 编辑:与解决方案: 问题答案: 看到: jQuery文档:发布 jQuery文档:序列化

  • 主要内容:在线实例,实例,实例,HTML 表单,实例,HTML 表单 - 输入元素,文本域(Text Fields),实例,密码字段,实例,单选按钮(Radio Buttons),实例,复选框(Checkboxes),实例,提交按钮(Submit),实例,实例,更多实例,表单实例,HTML 表单标签HTML 表单用于收集用户的输入信息。 HTML 表单表示文档中的一个区域,此区域包含交互控件,将用户收集到的信息发送到 Web 服务器。 在线实例 实例 <form action=""> First