2010-06-17 3 views
0

Ceci est mon code:Comment régler le type de contenu automatiquement lorsque je télécharge les données que j'ai téléchargées.

import os 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import template 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext import db 

#from login import htmlPrefix,get_current_user 

class MyModel(db.Model): 
    blob = db.BlobProperty() 

class BaseRequestHandler(webapp.RequestHandler): 
    def render_template(self, filename, template_args=None): 
    if not template_args: 
     template_args = {} 
    path = os.path.join(os.path.dirname(__file__), 'templates', filename) 
    self.response.out.write(template.render(path, template_args)) 

class upload(BaseRequestHandler): 
    def get(self): 
    self.render_template('index.html',) 
    def post(self): 
    file=self.request.get('file') 
    obj = MyModel() 
    obj.blob = db.Blob(file.encode('utf8')) 
    obj.put() 
    self.response.out.write('upload ok') 
class download(BaseRequestHandler): 
    def get(self): 
     #id=self.request.get('id') 
     o = MyModel.all().get() 
     #self.response.out.write(''.join('%s: %s <br/>' % (a, getattr(o, a)) for a in dir(o))) 
     self.response.out.write(o) 


application = webapp.WSGIApplication(
    [ 
     ('/?', upload), 
     ('/download',download), 
    ], 
    debug=True 
) 
def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 

Mon index.html est:

<form action="/" method="post"> 
<input type="file" name="file" /> 
<input type="submit" /> 
</form> 

Et ce spectacle:

<__main__.MyModel object at 0x02506830> 

Mais je ne veux pas voir cela, je veux pour le télécharger.

Comment changer mon code pour s'exécuter?

Merci

mis à jour

Il est ok maintenant:

class upload(BaseRequestHandler): 
    def get(self): 
    self.render_template('index.html',) 
    def post(self): 
    file=self.request.get('file') 
    obj = MyModel() 
    obj.blob = db.Blob(file) 
    obj.put() 
    self.response.out.write('upload ok') 
class download(BaseRequestHandler): 
    def get(self): 
     #id=self.request.get('id') 
     o = MyModel.all().order('-').get() 
     #self.response.out.write(''.join('%s: %s <br/>' % (a, getattr(o, a)) for a in dir(o))) 
     self.response.headers['Content-Type'] = "image/png" 
     self.response.out.write(o.blob) 

Et nouvelle question est:

si vous téléchargez un fichier '.png', il affichera avec succès , mais quand je télécharge un fichier rar, je vais courir l'erreur. Alors, comment définir Content-Type automatiquement et quel est le Content-Type du fichier 'rar'?

Merci

Répondre

1

Voir Nick's blog pour un exemple de travail.

Fondamentalement sur le téléchargement, vous devez tirer le fichier de self.request.POST au lieu de get afin d'obtenir l'objet plus utile cgi.FieldStorage. Vous pouvez ensuite lire le type mime de file.type, enregistrer la chaîne de caractères dans votre entité avec le blob, et l'écrire avec les en-têtes de réponse au téléchargement.

Une autre option est d'enregistrer file.name à votre entité lors du téléchargement, puis de le brancher sur mimetypes.guess_type() pour deviner un type basé sur l'extension du fichier lors du téléchargement.

0

Quel type de données est stocké dans votre blob? Est-ce une image? Parce que vous auriez besoin de le convertir en une image avant de l'écrire dans la réponse.

Ce que vous faites maintenant est d'écrire l'objet directement dans la réponse, ce qui entraîne l'impression d'une chaîne avec l'adresse et le type de l'objet. [Edit] Le type de contenu correct pour les fichiers RAR serait application/x-rar-compressed. Et je ne pense pas que vous pouvez déterminer automatiquement le type de contenu à partir d'un blob. Vous devez définir manuellement le type de contenu correct pour chaque type de fichier que vous souhaitez que les utilisateurs puissent télécharger.

+0

Salut tomlog, regardez la mise à jour. – zjm1126

Questions connexes