3

我有一個文件上傳其作品完美,但我想它,所以我做了以下....PIL - 提交的文件是空的測試用例

def test_post_ok(self): 

    image = Image.new('RGB', (100, 100) 
    tmp_file = tempfile.NamedTemporaryFile(suffix='.jpg') 
    image.save(tmp_file) 
    payload = { 
     "name": "Test", 
     "thumbnail_image": tmp_file 
    } 
    api = APIClient() 
    api.credentials(Authorization='Bearer ' + self.token) 
    response = api.post(url, payload, format='multipart') 

但是寫一個測試,測試給出錯誤...

<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=1024x768 at 0x108A5DCF8> 
{'thumbnail_image': [u'The submitted file is empty.']} 

我假設我沒有正確地做到這一點,如果不是爲什麼呢?

+0

之前重新打開該文件,你在使用庫APIClient()?我的猜測是你應該將文件內容轉換爲Base64,然後才能使用API​​發送它。但是這當然取決於你的APIClient()是否爲你做這件事。 –

+0

@WouterKleinHeerenbrink我使用''rest_framework.test'' – Prometheus

回答

4

我以前的猜測是錯誤的。您正在使用具有多部分功能的Rest Framework(真棒!),因此您可以按原樣發送文件,並且文件將被編碼爲多部分。

這裏的錯誤是:

  1. 您打開文件tmp_file
  2. 你寫的圖像內容到這個文件
  3. 現在的文件指針是在文件
  4. 你結束將文檔傳遞給APIClient(),它是一個簡單的測試包裝器,它通過rest_framework向上傳遞參數,最終將您的調用編碼爲
  5. 編碼將致電tmp_file.read()。由於指針仍然位於文件的末尾,因此read()將返回0字節,使您留下空白文檔。

解決方案: tmp_file.seek(0)或致電post()