2008-12-09 7 views
1

Éditer: Comment retourner/servir un fichier à partir d'un contrôleur python (back end) sur un serveur web, avec le nom de fichier? comme suggéré par @JVRetour du fichier à partir du module python

+0

La question est incomplète, je suppose. Vouliez-vous renvoyer/servir un fichier à partir d'un contrôleur python (back end) sur un serveur Web, avec un ensemble et un nom de type mime appropriés? –

+0

Cela n'a presque rien à voir avec Python. Ceci est une question sur le type de retour HTTP. La manière dont vous définissez le type de retour dépend de votre serveur Web. Quel framework de serveur web utilisez-vous? –

+0

@ S.lott - J'utilise cherrypy. Comment puis-je envoyer le nom de fichier avec la réponse cherrypy? –

Répondre

1

entièrement pris en charge à l'aide CherryPy

from cherrypy.lib.static import serve_file 

Comme indiqué dans le CherryPy docs - FileDownload:

import glob 
import os.path 

import cherrypy 
from cherrypy.lib.static import serve_file 


class Root: 
    def index(self, directory="."): 
     html = """<html><body><h2>Here are the files in the selected directory:</h2> 
     <a href="index?directory=%s">Up</a><br /> 
     """ % os.path.dirname(os.path.abspath(directory)) 

     for filename in glob.glob(directory + '/*'): 
      absPath = os.path.abspath(filename) 
      if os.path.isdir(absPath): 
       html += '<a href="/index?directory=' + absPath + '">' + os.path.basename(filename) + "</a> <br />" 
      else: 
       html += '<a href="/download/?filepath=' + absPath + '">' + os.path.basename(filename) + "</a> <br />" 

     html += """</body></html>""" 
     return html 
    index.exposed = True 

class Download: 
     def index(self, filepath): 
     return serve_file(filepath, "application/x-download", "attachment") 
     index.exposed = True 

if __name__ == '__main__': 
    root = Root() 
    root.download = Download() 
    cherrypy.quickstart(root) 
+0

L'indentation de la classe ' Télécharger' est éteint. Le retour n'est pas sous la méthode 'index' et l'utilisation de 8 espaces est incohérente avec les 4 espaces utilisés ailleurs. – Swoogan

2

Vous pouvez soit renvoyer une référence au fichier lui-même, c'est-à-dire le chemin d'accès complet au fichier. Ensuite, vous pouvez ouvrir le fichier ou le manipuler autrement. Ou, le plus normal est de renvoyer la poignée de fichier et d'utiliser les opérations standard de lecture/écriture sur la poignée de fichier.

Il est déconseillé de transmettre les données réelles car les fichiers peuvent être trop grands et le programme peut manquer de mémoire.

Dans votre cas, vous voulez probablement retourner un tuple contenant le fichier ouvert, le nom du fichier et toute autre méta-données qui vous intéresse.

0

Pour plus d'informations sur les types MIME (qui sont comment les téléchargements se produisent) , commencez ici: Properly Configure Server MIME Types.

Pour plus d'informations sur CherryPy, regardez les attributs d'un objet Response. Vous pouvez définir le content type de la réponse. En outre, vous pouvez utiliser tools.response_headers pour définir le type de contenu.

Et, bien sûr, il y a un exemple de File Download.

+0

simplement corriger le lien (faute de frappe) de http: //https//developer.mozilla.org/en/Properly_Configuring_Server_MIME_Types à https://developer.mozilla.org/en/Properly_Configuring_Server_MIME_Types –

Questions connexes