1

我設立一個服務:HttpError 400試圖上傳PDF文件在谷歌雲存儲時

  1. 會收到一封電子郵件的附件文件
  2. 上傳該文件到雲存儲
  3. 使用了文件作爲進一步處理的來源

我到達了發生錯誤的第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` 

回答

2

你構建調用看起來正確的給我。這個example爲如何將文件作爲新對象上傳到GCS提供了很好的參考。您可以傳遞包含文檔MediaIoBaseUpload文檔

+0

中所述的對象內容的io.BytesIO,而不是將文件句柄傳遞給MediaIoBaseUpload。不幸的是,該示例僅顯示如何使用本地計算機上的文件。電子郵件附件是一個谷歌對象,而不是一個普通的python文件對象。到目前爲止,問題還沒有出現在主體的內容上,而是由端點自己調用。 – ciacicode

+0

正確的 - 第二個鏈接顯示MediaIoUpload與io.BytesIO和任意字節的使用,但也很容易被StringIO的等 –

+0

謝謝你@Angus戴維斯我得到了它與我上面貼的變化工作,即使我上傳後無法成功打開pdf。我認爲,儘管這與編碼有關,所以這個問題本身得到了回答。當這樣的錯誤400出現時,它指向缺少用適當的文件流對象填充的media_body參數。 – ciacicode

相關問題