2010-03-27 5 views
6

J'ai réussi à obtenir des pièces jointes sur Amazon S3 à partir d'un e-mail entrant GAE, mais est-ce que quelqu'un connaît une technique pour obtenir une pièce jointe, comme une image, dans le blobstore.Est-il possible d'obtenir une pièce jointe d'email dans Blobstore d'App Engine?

Toute aide serait grandement appréciée.

code jusqu'à présent (avec l'aide d'Alex)

upload_url = blobstore.create_upload_url('/upload') 
msg = MIMEMultipart() 
msg.set_type('multipart/form-data') 
msg.set_payload({'file': content}) 
result = urlfetch.fetch(upload_url, payload=urllib.urlencode(msg), method=urlfetch.POST, headers={'Content-Type': 'multipart/form-data'}) 
+0

Y a-t-il une raison pour laquelle vous ne pouvez pas stocker le fichier téléchargé directement dans le magasin de données? –

+0

Le champ de téléchargement sur la page peut accepter des fichiers de plus de 1 Mo, je veux que tous les fichiers soient dans le blobstore, même à partir des emails, j'ai donc besoin des pièces jointes pour y aller aussi. – Effisfor

Répondre

11

Pour recevoir du courrier dans votre application GAE, suivez les docs here: en particulier, vous aurez une instance de la classe InboundEmailMessage avec un attribut qui attachments , et je cite:

est une liste de pièces jointes, éventuellement vide. Chaque valeur dans la liste est un tuple de deux éléments: le nom de fichier et le contenu du fichier.

Ensuite, par these GAE docs, vous « créer une URL de téléchargement » et dans votre gestionnaire de téléchargement (généralement une sous-classe de BlobstoreUploadHandler) vous utilisez get_upload pour obtenir BlobInfo instances et mettre leurs métadonnées quelque part qui plus tard vous laisser aller les chercher retour comme votre application peut l'exiger.

Enfin, vous POST les données (que vous avez de attachments, ci-dessus) à votre propre "upload URL", par exemple. en utilisant urlfetch.fetch (avec method-POST et une charge utile en standard application/x-www-form-urlencoded codage pour le "formulaire" que l'utilisateur serait de remplir si elles étaient en train de télécharger les données directement, qui est la façon "normale" de mettre des données dans le blobstore - par exemple vous pouvez utilisez urllib.urlencode pour préparer la charge utile). Ce "self-POST" utilisera une autre instance de votre application pour "recevoir" les données dans le blobstore (alors que l'instance qui a reçu l'email attend, car fetch est synchrone).

+0

N'auriez-vous pas besoin d'une demande de formulaire codé en plusieurs parties (comme c'est une pièce jointe là-bas)? J'ai essayé de coder quelque chose qui va poster sur blobstore à partir du code du serveur pendant un certain temps maintenant sans succès .... –

+0

Oui, je crois que vous avez besoin de multipart (et shd a mentionné que le module 'email' peut aider préparer cela). –

+0

@ Tomás, je n'ai pas de code de travail parce que je n'ai pas blobstore dans mon compte GAE (car je n'ai pas activé la facturation là-bas). Pour l'encodage, ayant utilisé 'email', utilisez' msg.flatten() '. Je vous suggère de modifier votre Q pour afficher ce code afin de pouvoir le formater. –