2010-09-20 5 views
0

Cadre: Django Langue: Python OS: UbuntuComment créer un fichier téléchargeable sur un serveur local via HTTP en python?

Par exemple, supposons que j'ai un fichier "xyz.pdf" à "/ home/nom d'utilisateur/projet /". J'ai une page Web avec le bouton de téléchargement. Donc, si les gens cliquent sur ce bouton de téléchargement, le fichier xyz.pdf devrait être téléchargé.

Ce que je l'ai fait,

  1. créé une page avec bouton de téléchargement avec href comme « télécharger/» (comme vous le savez cette URL n'a pas d'importance beaucoup)
  2. il est redirigé vers urls.py et trouve la vue appropriée dire par exemple "xyzdownload"
  3. à xyzdownload je code suivant, la réponse = urllib2.urlopen ('./ projet/xyz.pdf') html = response.read()

L'erreur que j'obtiens est inconnue Type d'URL: ./project/xyz.pdf

Veuillez me faire savoir si vous avez besoin de plus de précisions. Merci beaucoup

+0

Pouvez-vous reformuler votre question? Où les gens cliquent-ils? Comment comptez-vous servir le fichier? –

+0

????? Clarifier?? – Santa

+0

Si vous utilisez Apache, le problème empêche django de rediriger les URL censées servir le support statique, vous devez configurer un alias dans httpd.conf pour votre dossier de support statique avant de passer le reste de les demandes à Django (wsgi); – mpen

Répondre

1

Généralement, vous voudriez simplement héberger le fichier dans apache etc., et fournir un lien vers l'emplacement. Si le fichier est généré dynamiquement, ou si vous voulez « embargo », voici comment vous pourriez le faire avec cherrypy:

@cherrypy.expose 
def download(self, filename): 
    """ 
    Download the specified XML file 
    """ 

    # only if it's one of these files 
    if filename not in "foo.xml bar.xml".split(): 
     return "Nice try" 

    content = open("/path/to/media/" + filename).read() 

    cherrypy.response.headers['Content-Type'] = 'application/xml' 
    cherrypy.response.headers['Content-Length'] = len(content) 
    disp = 'attachment; filename=%s' filename 
    cherrypy.response.headers['Content-Disposition'] = disp 
    cherrypy.response.headers['filename'] = 'application/xml' 
    cherrypy.response.headers['pragma'] = "" 
    cherrypy.response.headers['content-cache'] = "" 

    return content 

Le lien serait comme ceci:

http://example.com/download/foo.xml 
+0

J'ai clarifié la question. Peut-être que cela vous aidera à comprendre correctement ma question. –

0

L'erreur Je reçois est de type inconnu URL: ./project/xyz.pdf

C'est simple: ./project/xyz.pdf est pas une URL. Wikipedia dit:

Chaque URL se compose d'une partie de la suivante: le nom du système (communément protocole appelé ), suivi par deux points, puis, selon le schéma, un nom d'hôte (alternativement, adresse IP) , un port numéro, le chemin de la ressource à tiré par les cheveux ou le programme à exécuter, alors, pour des programmes tels que les scripts Common Interface passerelle (CGI), une chaîne de requête , et avec des documents HTML , un ancre (facultatif) pour où la page devrait commencer à être affiché.

Vous n'avez pas fourni le nom du système et le nom d'hôte . Cependant, je ne comprends pas pourquoi vous faites cela. Appeler urlopen signifie: télécharger ce fichier sur mon pc. Il ne signifie pas "donner le fichier à l'utilisateur".BTW, la vue xyzdownload doit être définie comme @Ryan Ginstrom suggested you. Bien sûr, vous devez adapter le code à Django. Pour obtenir des exemples, consultez here. Et bien sûr, vous devriez lire la question this parce que c'est presque le même que celui que vous avez fait.

0

vous pouvez essayer mécaniser pour les adeptes cliquant texte et url par regex il

import mechanize 

br = mechanize.Browser() 

# Browser options 
br.set_handle_equiv(True) 
br.set_handle_gzip(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 

# Follows refresh 0 but not hangs on refresh > 0 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 

# Want debugging messages? 
#br.set_debug_http(True) 
#br.set_debug_redirects(True) 
#br.set_debug_responses(True) 

# User-Agent (this is cheating, ok?) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 

# Download xyz.pdf ;) 
f = br.retrieve('http://www.site.com/xyz.pdf')[0] 
print f 
fh = open(f) 

# or you may try with click download just uncomment 
# br.click_link(text_regex="download") 

# or by url regex 
# br.click_link(url_regex="project/xyz.pdf", nr=0) 

et vérifier ressource énorme et tutoriel ici http://wwwsearch.sourceforge.net/mechanize/

Questions connexes