2010-03-27 6 views
6

Udało mi się uzyskać załączniki wiadomości e-mail na Amazon S3 z przychodzącej wiadomości e-mail GAE, ale czy ktoś zna technikę, aby uzyskać załącznik, jak obraz, do blobstore.Czy można dostać załącznik e-mail do blobstore App Engine?

Każda pomoc będzie mile widziana.

Kod tej pory (z pomocą 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

Czy istnieje powód, dla którego nie można po prostu zapisać przesłanego pliku bezpośrednio w magazynie danych? –

+0

Pole przesyłania na stronie może akceptować pliki większe niż 1 MB, chcę, aby wszystkie pliki trafiały do ​​blobstore, nawet z wiadomości e-mail, więc potrzebuję załączników e-mail, aby tam wejść. – Effisfor

Odpowiedz

11

odbierać pocztę w swojej aplikacji GAE, wykonaj docs here, aw szczególności: dostaniesz instancję klasy InboundEmailMessage z atrybutem attachments który , a ja cytuję:

to lista załączników do plików, być może pusta. Każda wartość na liście jest krotką dwóch elementów: nazwy pliku i zawartości pliku.

Następnie za these GAE docs, to „stworzyć URL upload” oraz w swojej obsługi przesyłania (zwykle podklasy z BlobstoreUploadHandler) użyć get_upload dostać BlobInfo instancji i umieścić ich metadane gdzieś która później pozwoli Ci sprowadzić je z powrotem jak może wymagać Twoja aplikacja.

Na koniec, POST dane (które masz od attachments powyżej) na swój świeżo wygenerowany "adres URL przesyłania", np. przy użyciu urlfetch.fetch (z method-POST i ładunkiem w standardzie application/x-www-form-urlencoded kodującym "formularz", który użytkownik wypełniałby, gdyby bezpośrednio przesyłał dane, co jest "normalnym" sposobem umieszczania danych w blobstore - np. możesz użyj urllib.urlencode do przygotowania ładunku).

Ten "własny POST" będzie używał innej instancji aplikacji do "odbierania" danych do blobstore (podczas gdy instancja, która otrzymała wiadomość e-mail, czeka, ponieważ fetch jest synchroniczna).

+0

Czy nie potrzebujesz wielowarstwowej, zakodowanej prośby o formularz (ponieważ jest tam plik załącznika)? Próbowałem kodować coś, co będzie publikować do blobstore z kodu serwera od jakiegoś czasu bez powodzenia .... –

+0

Tak, wierzę, że potrzebujesz wieloczęściowy (i shd wspomniałem, że moduł 'email' może pomóc przygotowując to). –

+0

@ Tomás, Nie mam działającego kodu, ponieważ nie mam blobstore na moim koncie GAE (ponieważ nie włączyłem tam rozliczeń). Do kodowania, używając 'email', użyj' msg.flatten() '. Sugeruję, żebyś zmodyfikował swoje Q, by pokazać ten kod, żebyś mógł go sformatować. –