You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

直接上传文件至Google Cloud Document AI时遇400错误求助

解决Google Cloud Document AI 400错误:Inline document content must be provided.

问题排查与修复步骤

1. 修复表单验证调用错误

代码中if form.is_valid:缺少括号,导致表单验证逻辑未执行,可能跳过文件上传合法性检查,引发文件内容读取异常。修改为:

if form.is_valid():  # 补充括号,执行表单验证

2. 避免变量名冲突

创建Document AI请求时,request变量覆盖了原Django请求对象,虽当前代码未触发问题,但属于不良编码习惯,建议重命名:

# 重命名为docai_request,避免覆盖原request对象
docai_request = documentai.ProcessRequest(
    name=name,
    raw_document=documentai.RawDocument(content=image_content, mime_type="image/jpeg"),
)

result = docai_client.process_document(request=docai_request)

3. 确保文件内容正确读取且MIME类型匹配

  • 添加验证代码确认文件内容是否读取成功:
uploaded_file = request.FILES["file"]
# 打印文件信息,验证是否获取到有效文件
print(f"文件名: {uploaded_file.name}, 文件大小: {uploaded_file.size}")
image_content = uploaded_file.read()
# 检查读取内容长度,若为0则说明读取失败
print(f"读取内容长度: {len(image_content)}")
  • 不要硬编码MIME类型,改用文件自身的content_type:
raw_document=documentai.RawDocument(
    content=image_content, 
    mime_type=uploaded_file.content_type
)

4. 确认表单字段配置正确

检查UploadReceiptForm中的文件字段是否为FileField,示例配置:

from django import forms

class UploadReceiptForm(forms.Form):
    file = forms.FileField(label="上传收据文件")

完整修复后的代码片段

def upload(request):
    template_name = "upload.html"

    if request.method == "POST":
        form = UploadReceiptForm(request.POST, request.FILES)
        
        if form.is_valid():
            docai_client = documentai.DocumentProcessorServiceClient(
                client_options=ClientOptions(
                    api_endpoint=globals.GOOGLE_CLOUD_DOCUMENT_AI_ENDPOINT
                )
            )

            name = docai_client.processor_version_path(
                globals.GOOGLE_CLOUD_PROJECT_ID, 
                globals.GOOGLE_CLOUD_DEFAULT_LOCATION, 
                globals.GOOGLE_CLOUD_DEFAULT_PROCESSOR_ID, 
                globals.GOOGLE_CLOUD_DEFAULT_PROCESSOR_VERSION_ID
            )
            
            uploaded_file = request.FILES["file"]
            image_content = uploaded_file.read()
            
            docai_request = documentai.ProcessRequest(
                name=name,
                raw_document=documentai.RawDocument(
                    content=image_content, 
                    mime_type=uploaded_file.content_type
                ),
            )

            result = docai_client.process_document(request=docai_request)
            
            return HttpResponseRedirect("/upload/")

    else:
        form = UploadReceiptForm()

    return render(request, template_name, {"form": form})

内容的提问来源于stack exchange,提问作者SeaSky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:35:54