直接上传文件至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
相关产品推荐
相关产品推荐

