如何用Python将二进制图片上传至Azure存储账户?代码问题排查
问题分析与解决
你的代码核心问题是误用了open()函数:open()需要接收文件路径字符串,但你传入的是UploadFile实例,这会直接导致报错,根本走不到读取字节的步骤。
修正后的代码
async def resolve_fileUpload(_, info, file): print(f"File - {type(file)}") container_client = blob_service_client.get_container_client('4160000000') if not container_client.exists(): container_client.create_container() try: # 直接读取UploadFile实例的字节数据,注意用await(因为UploadFile的read是异步方法) file_content = await file.read() result = container_client.upload_blob(name='avatar', data=file_content) # 从返回结果中获取真实的文件URL,替换测试地址 file_url = result.url return { "status": 200, "error": "", "fileUrl": file_url } except Exception as e: return { "status": 500, "error": str(e), "fileUrl": "" }
关键改动说明
- 移除错误的
with open(file, "rb")代码块:UploadFile本身是封装好的上传文件对象,不需要再用open打开。 - 使用
await file.read()获取字节数据:UploadFile的read()是异步方法(适配FastAPI/Starlette的异步IO模型),必须加await才能正确读取内容。 - 添加异常捕获:上传过程中可能出现网络错误、权限问题等,捕获异常后返回错误信息,方便排查问题。
- 替换测试URL:从
upload_blob返回的BlobClient实例中可以获取真实的文件URL,比硬编码的测试地址更实用。
如果你的blob_service_client是同步客户端,可考虑用asyncio.to_thread()包裹上传逻辑,避免阻塞异步事件循环;若使用的是Azure异步Blob客户端则无需额外处理。
内容的提问来源于stack exchange,提问作者Sumchans
相关产品推荐
相关产品推荐

