import os import requests import time bfl_api_key = "eb51836e-9414-4dcc-a5b9-42418b49f00e" # 发送任务请求 request = requests.post( 'https://api.us1.bfl.ai/v1/flux-dev', headers={ 'accept': 'application/json', 'x-key': bfl_api_key, 'Content-Type': 'application/json', }, json={ 'prompt': 'A cat on its back legs running like a human is holding a big silver fish with its arms. The cat is running away from the shop owner and has a panicked look on his face. The scene is situated in a crowded market.', 'width': 1024, 'height': 768, }, ).json() print(request) request_id = request["id"] # 获取结果 while True: time.sleep(0.5) result = requests.get( 'https://api.us1.bfl.ai/v1/get_result', headers={ 'accept': 'application/json', 'x-key': bfl_api_key, }, params={ 'id': request_id, }, ).json() if result["status"] == "Ready": print(f"Result: {result['result']['sample']}") break else: print(f"Status: {result['status']}") print(result) 将返回结果的图片保存到本地
时间: 2025-06-11 10:57:15 浏览: 20
<think>好的,我现在需要帮助用户将返回的图片保存到本地。用户提供的代码已经能够发送请求并轮询结果,直到状态变为“Ready”。现在的问题是,当结果准备好时,如何将图片保存到本地文件。
首先,我需要查看用户现有的代码。在用户提供的代码中,当状态为“Ready”时,会打印result['result']['sample'],这可能是图片的URL。用户希望将这个URL的图片下载并保存到本地。
接下来,我需要确定如何从结果中提取图片的URL。根据用户代码中的print语句,假设result['result']['sample']包含图片的URL。需要确认这个字段是否存在且是正确的URL。
然后,如何下载图片。Python中可以使用requests库的get方法获取图片内容,然后将内容写入文件。需要注意处理可能的异常,比如网络错误或无效的URL。
保存图片时,需要指定文件名和路径。用户可能需要自定义文件名,比如使用request_id作为文件名,或者根据时间戳生成。同时,需要确定保存的目录是否存在,如果不存在是否需要创建。用户可能希望将图片保存在当前目录下的某个文件夹,比如“images”。
另外,需要考虑文件扩展名。图片URL可能包含扩展名,比如.jpg或.png,需要从URL中提取,或者根据实际情况指定。如果URL中没有扩展名,可能需要根据内容类型判断。
还需要处理可能的错误情况。例如,如果result['result']['sample']不是有效的URL,或者下载图片时发生错误,应该添加异常处理,避免程序崩溃。
最后,整合这些步骤到用户的现有循环中。当状态为“Ready”时,提取URL,下载图片,保存到本地,然后break退出循环。
可能的改进点:添加路径检查,自动创建保存目录;处理不同的图片格式;增加错误处理;允许自定义文件名等。
现在需要将这些步骤转化为代码,插入到用户现有的代码中。具体来说,在print(f"Result: {result['result']['sample']}")之后,添加下载和保存图片的逻辑。</think>以下是修改后的完整代码,包含图片保存功能及详细注释:
```python
import os
import requests
import time
from pathlib import Path # 用于处理文件路径
# 配置信息
bfl_api_key = "eb51836e-9414-4dcc-a5b9-42418b49f00e"
SAVE_DIR = "generated_images" # 图片保存目录
# 创建保存目录(如果不存在)
Path(SAVE_DIR).mkdir(parents=True, exist_ok=True)
# 发送生成请求
request = requests.post(
'https://api.us1.bfl.ai/v1/flux-dev',
headers={
'accept': 'application/json',
'x-key': bfl_api_key,
'Content-Type': 'application/json',
},
json={
'prompt': 'A cat on its back legs running like a human is holding a big silver fish with its arms. The cat is running away from the shop owner and has a panicked look on his face. The scene is situated in a crowded market.',
'width': 1024,
'height': 768,
},
).json()
request_id = request["id"]
print(f"任务已提交,请求ID: {request_id}")
# 轮询结果
while True:
time.sleep(0.5)
result = requests.get(
'https://api.us1.bfl.ai/v1/get_result',
headers={
'accept': 'application/json',
'x-key': bfl_api_key,
},
params={'id': request_id},
).json()
current_status = result["status"]
print(f"当前状态: {current_status}")
if current_status == "Ready":
image_url = result["result"]["sample"]
print(f"生成完成,图片地址: {image_url}")
# 下载图片
try:
img_response = requests.get(image_url, timeout=10)
img_response.raise_for_status() # 检查HTTP错误
# 生成文件名(使用请求ID + 时间戳)
filename = f"{request_id}_{int(time.time())}.png"
save_path = os.path.join(SAVE_DIR, filename)
# 保存图片
with open(save_path, "wb") as f:
f.write(img_response.content)
print(f"图片已保存至: {save_path}")
except Exception as e:
print(f"保存图片失败: {str(e)}")
break # 结束轮询
elif current_status in ["Failed", "Cancelled"]:
print(f"任务异常终止,状态: {current_status}")
break
```
---
### 核心改进说明
1. **文件路径管理**
- 使用 `pathlib.Path` 自动创建保存目录
- 通过 `os.path.join` 保证跨平台路径兼容性
2. **图片下载健壮性**
- 添加 `timeout=10` 防止无限等待
- 使用 `raise_for_status()` 检查HTTP错误
- 包含异常处理块捕获下载问题
3. **文件名生成策略**
- 组合请求ID和时间戳确保唯一性
- 固定使用.png扩展名(可根据需要修改)
4. **状态处理增强**
- 明确处理 "Failed" 和 "Cancelled" 状态
- 输出更详细的进度信息
---
### 关键参数说明
| 参数 | 说明 |
|----------------|----------------------------------------------------------------------|
| `SAVE_DIR` | 可修改为任意有效路径(如 `"/tmp/images"`) |
| `timeout=10` | 下载超时时间(秒),根据网络情况调整 |
| `.png` | 假设API返回PNG格式,如实际为JPG需修改扩展名 |
---
### 扩展建议
1. **批量下载**
如果返回多个图片URL,可遍历列表下载:
```python
for i, url in enumerate(image_urls):
# 添加序号到文件名
filename = f"{request_id}_{i}.png"
```
2. **进度显示**
添加进度条显示等待状态:
```python
from tqdm import tqdm
pbar = tqdm(desc="生成进度")
while True:
# ... 轮询逻辑 ...
pbar.update(1)
```
3. **配置分离**
将API密钥等敏感信息存入环境变量:
```python
import os
bfl_api_key = os.getenv("BFL_API_KEY")
```
阅读全文
相关推荐


















