2011-03-07 2 views
2

J'essaie de télécharger un fichier récupéré sur un serveur. Mais lorsque le fichier récupéré est plus grand que 1 Mo, il n'y aura qu'un petit fichier de 1 Ko enregistré à S3. Quand il est inférieur à 1 Mo, le fichier sera sauvegardé correctement.AppEngine: Obtenir seulement 1 Ko lors du téléchargement depuis une URL récupérée vers S3

J'ai cherché et essayé de différentes manières, mais aucune d'elles ne fonctionne. Voici la classe qui est déclenchée par l'utilisateur en cliquant sur un bouton.

` classe Fetch_by_button (webapp.RequestHandler):

def get(self): 
    #1. fetch the file 
    try: 
     result = urlfetch.fetch('http://someurl.com/music.mp3') # file with 2MB 
     #result = urlfetch.fetch('http://anotherurl.com/document.pdf') #file with 900KB is working 
    except DownloadError: 
     print("URL fetch doesnt work properly") 

    #2. search datastore UserData-model by userobject to get s3 credentials 
    usr = users.get_current_user() 
    query = UserData.gql("WHERE account =:1", usr) 
    qr = query.get() 

    #3. establish connection to s3 
    conn = S3Connection(qr.s3_accesskey, qr.s3_secret_accesskey) 

    #4. create bucket 
    ak_lowercase = str.lower(str(qr.s3_accesskey)) 
    individual_bucket_name = ak_lowercase + '_' + usr.nickname() 
    bucket = conn.create_bucket(individual_bucket_name) 

    #5. generate key and assign to already created bucket 
    k = Key(bucket) 

    #6. name the key by some examplary filename 
    k.key = 'justsomefilename' 

    #7. save the correspondent value to the created key 
    k.set_contents_from_string(result.content)` 

Je viens de ne pas avoir la moindre idée pourquoi cela se produit. Quelque chose avec mon code, certaines restrictions AppEngine, n'importe quoi avec boto, ... Des suggestions?

Merci d'avance.

Répondre

2

La taille maximale des requêtes sur le moteur de l'application est de 1 mb pour urlfetch. Je suppose que votre classe S3Connection l'utilise pour effectuer le transfert. Les réponses peuvent atteindre 32MB, c'est pourquoi le téléchargement fonctionne.

+0

La classe S3Connection provient de la bibliothèque boto et utilise la classe HTTPConnection de httplib. Néanmoins, ce que boto utilise pour créer des connexions et envoyer des données - il semble que la limite de 1Mo d'AppEngines sur chaque type de requête sortante. Si personne ne peut nier cela, ou suggérer une solution de contournement/solution ... Je vais devoir repenser mon application :( – Michael

+0

@Michael C'est correct urllib, httplib etc sont tous des mocks pour urlfetch en production sur App Engine –

+0

Si GAE simplement a augmenté la limite de téléchargement à 5 Mo, tout serait dandy, puisque S3 prend en charge le téléchargement de plusieurs parties: http://bit.ly/fUynir – Amir

Questions connexes