cloudflare / cloudflare/cloudflare-python

Create Image Upload is broken for Sync and Async

オープン
#2,569 コメント 3 件 リアクション 6 件 担当者 0 名 GitHub で見る
主要言語
Python
スター
506
フォーク
148
平均マージ
3時間 15分
マージ済み PR(30日)
1

説明

### Confirm this is a Python library issue and not an underlying Cloudflare API issue.

- [x] This is an issue with the Python library

### Describe the bug

The Cloudflare Image Create function is broken.

There is an example below, this has also been discussed on StackOverflow

https://stackoverflow.com/questions/79032782/error-5455-when-uploading-to-cloudflare-images-using-python-library

I cant see any test coverage for this use case.

https://github.com/cloudflare/cloudflare-python/blob/fc6ca90779cd230dc06445ba42e4c540da186ce0/tests/api_resources/images/test_v1.py#L28

### To Reproduce

This is a **working** example using Python Requests
```python
import requests
with open(
"water bottle.webp", "rb"
) as f:
data = f.read()

# try requests
files = {
"file": (
"water bottle.webp",
data,
"image/webp",
)
}

response = requests.post(
url=f"https://api.cloudflare.com/client/v4/accounts/{CLOUDFLARE_ACCOUNT_ID}/images/v1",
headers={
"Authorization": f"Bearer ..."
},
files=files,
)
print(response.status_code)
print(response.json())
```

This is a **broken** example using the Cloudflare Sync function

```python
with open(
"water bottle.webp", "rb"
) as f:
data = f.read()

from cloudflare import Cloudflare

client = Cloudflare(
api_token='...'
)

# Create a tuple: (filename, binary data, content type)
file_tuple = ("water bottle.webp", data, "image/webp",)

cloudflare_image = await client.images.v1.create(
account_id=CLOUDFLARE_ACCOUNT_ID,
file=file_tuple,
)
print(cloudflare_image)
```

The output is
```
cloudflare.BadRequestError: Error code: 400 - {'result': None, 'success': False, 'errors': [{'code': 5400, 'message': 'Bad request: Error parsing form fields'}], 'messages': []}
```

This is a broken example using the Async Cloudflare function

```python
from cloudflare import AsyncCloudflare

client = AsyncCloudflare(
api_token='...'
)

# Create a tuple: (filename, binary data, content type)
file_tuple = ("water bottle.webp", data, "image/webp",)

cloudflare_image = await client.images.v1.create(
account_id=CLOUDFLARE_ACCOUNT_ID,
file=file_tuple,
)
print(cloudflare_image)
```

The output is
```
cloudflare.BadRequestError: Error code: 400 - {'result': None, 'success': False, 'errors': [{'code': 5400, 'message': 'Bad request: Error parsing form fields'}], 'messages': []}
```

### Code snippets

```Python

```

### OS

macOS

### Python version

3.12.9

### Library version

v4.1.0

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

まず Cloudflare クライアントと AsyncCloudflare クライアントの両方で images.v1.create から始め、次に関連するカバレッジ周辺の tests/api_resources/images/test_v1.py を確認します。WebP ファイル用に示されているタプルを使って multipart アップロードを再現し、リクエストがフォームフィールドのパースエラーなしでアップロードを受け付けるようになったら、同期ケースと非同期ケースのカバレッジを追加します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
api
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。