我設立一個服務:HttpError 400試圖上傳PDF文件在谷歌雲存儲時
- 會收到一封電子郵件的附件文件
- 上傳該文件到雲存儲
- 使用了文件作爲進一步處理的來源
我到達了發生錯誤的第2步。我正在使用Google服務的發現API進行身份驗證。 Mine是一個簡單的應用程序,下面是傳入的電子郵件處理程序。
handle_incoming_email.py
__author__ = 'ciacicode'
import logging
import webapp2
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
from oauth2client.client import GoogleCredentials
from googleapiclient.discovery import build
credentials = GoogleCredentials.get_application_default()
class LogSenderHandler(InboundMailHandler):
def receive(self, mail_message):
logging.info("Received a message from: " + mail_message.sender)
# upload attachment to cloud storage
filename = 'any'
try:
attachment = mail_message.attachments
filename = attachment[0].filename
body = str(attachment[0].payload)
except IndexError:
print len(attachment)
storage = build('storage', 'v1', credentials=credentials)
req = storage.objects().insert(bucket='ocadopdf', body={'body': body, 'contentType': 'application/pdf', 'name': str(filename), 'contentEncoding': 'base64'})
resp = req.execute()
return resp
app = webapp2.WSGIApplication([LogSenderHandler.mapping()], debug=True)
後,我發送電子郵件至我看到在日誌下面的錯誤的服務:
HttpError: https://www.googleapis.com/storage/v1/b/ocadopdf/o?alt=json returned "Upload requests must include an uploadType URL parameter and a URL path beginning with /upload/">
我明白,信息不發佈到而且缺少一個URL參數,但我在Google文檔中挖掘的越多,我就越能找到清楚如何使用發現模塊中的.build以在服務存儲之前添加URL路徑的內容E」。
- 更新與解決方案 -
file = cStringIO.StringIO()
file.write(body)
media = http.MediaIoBaseUpload(file, mimetype='application/pdf')
storage = build('storage', 'v1', credentials=credentials)
req = storage.objects().insert(bucket='ocadopdf', body={'name': str(filename), 'contentEncoding': 'base64'}, media_body=media)
resp = req.execute()
return resp`
中所述的對象內容的io.BytesIO,而不是將文件句柄傳遞給MediaIoBaseUpload。不幸的是,該示例僅顯示如何使用本地計算機上的文件。電子郵件附件是一個谷歌對象,而不是一個普通的python文件對象。到目前爲止,問題還沒有出現在主體的內容上,而是由端點自己調用。 – ciacicode
正確的 - 第二個鏈接顯示MediaIoUpload與io.BytesIO和任意字節的使用,但也很容易被StringIO的等 –
謝謝你@Angus戴維斯我得到了它與我上面貼的變化工作,即使我上傳後無法成功打開pdf。我認爲,儘管這與編碼有關,所以這個問題本身得到了回答。當這樣的錯誤400出現時,它指向缺少用適當的文件流對象填充的media_body參數。 – ciacicode