2013-07-15 50 views
0

這裏是的情況:python使用海報POST一個StringIO

我使用PIL處理圖像,然後我將它保存到一個StringIO對象。 現在,我想通過海報POST StringIO對象。 但是,我無法得到request.FILES字典中的圖像。 我GOOGLE了幾個小時,我發現這個問題, python : post data within stringIO through poster? 我試過,但沒有工作。

因此,我閱讀海報源代碼,發現它試圖獲得文件類對象參數的'名稱'屬性,但它好像是StringIO對象沒有'名稱'屬性,所以,文件名和文件類型是無

if hasattr(value, 'read'): 
    # Looks like a file object 
    filename = getattr(value, 'name', None) 
    if filename is not None: 
     filetype = mimetypes.guess_type(filename)[0] 
    else: 
     filetype = None 

    retval.append(cls(name=name, filename=filename, 
     filetype=filetype, fileobj=value)) 
else: 
    retval.append(cls(name, value)) 

因此,我指定了StringIO對象的名稱歸屬,它似乎工作正常。

im_tmp = Image.open(StringIO(bits)) 
//bits: the binary chars of a image 
im_res = ImageAPI.process(im_tmp, mode, width, height) 
//ImageAPI: a class that use PIL methods to process image 
output = StringIO() 
im_res.save(output, format='PNG') 
output.name = 'tmp.png' 
//I add above code and it works 
call(url_str=url, file_dict={'file':output}) 
//call: package of poster 

我做對了嗎?通過海報發佈一個StringIO對象的正確方法是什麼?

回答

0

this commit,使得名可選做明確支持傳遞一個StringIO對象,但是當你發現,然後跳過檢測MIME類型,默認爲text/plain代替。

那麼你的方法是完全正確的。只需將.name屬性設置爲goad poster即可檢測MIME類型。

另一種方法是使用更好的庫發佈到網上。我建議你看看requests,其中supports multipart POSTing of files開箱即可,包括一種設置文件名的方法。如果傳入,mimetype將基於該明確的文件名。

+0

謝謝,但該項目正在使用海報,我無法更改結構。 – Jinvan