2010-05-24 7 views
3

Je voulais concevoir un site simple où une personne peut télécharger un fichier, et passer l'adresse web au hasard à quelqu'un, qui peut ensuite le télécharger.Site de partage de fichiers en Python

À ce stade, j'ai une page Web où quelqu'un peut télécharger avec succès un fichier qui est stocké sous/files/sur mon serveur web.

Le script python génère également un code 5 aléatoire unique lettre qui est stockée dans une base de données identifiant le fichier

J'ai une autre page appelée récupérer, où une personne devrait aller, mettre dans le code de 5 lettres, et il devrait apparaître une boîte de fichier demandant où enregistrer le fichier.

Mon problème est le suivant: 1) Comment récupérer le fichier à télécharger? À ce stade, mon script de récupération, prend le code, obtient l'emplacement du fichier sur mon serveur, mais comment puis-je obtenir le navigateur pour commencer le téléchargement?

2) Comment empêcher les gens d'accéder directement au fichier? Dois-je changer les autorisations sur le fichier?

+2

C'est un peu hors sujet, mais vous devriez probablement générer un hachage (comme SHA1) et utilisez cela au lieu du code de 5 lettres pour le stockage. Cela permettrait d'éviter les doublons dans le même fichier, tout en étant une méthode d'authentification plus puissante. – alternative

Répondre

2

Comment servez-vous la page de téléchargement de fichiers, et comment laissez-vous vos utilisateurs télécharger des fichiers?
Si vous utilisez les modules de serveur HTTP intégrés de Python, vous ne devriez rencontrer aucun problème.
De toute façon, voici comment la partie de traitement de fichiers est faite en utilisant les modules intégrés de Python (juste l'idée de base). En ce qui concerne votre deuxième question, si vous utilisiez ces modules en premier lieu, vous ne l'auriez probablement pas demandé car vous auriez à fournir explicitement des fichiers spécifiques.

import SocketServer 
import BaseHTTPServer 


class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 

    def do_GET(self): 
     # The URL the client requested 
     print self.path 

     # analyze self.path, map the local file location... 

     # open the file, load the data 
     with open('test.py') as f: data = f.read() 

     # send the headers 
     self.send_response(200) 
     self.send_header('Content-type', 'application/octet-stream') # you may change the content type 
     self.end_headers() 
     # If the file is not found, send error code 404 instead of 200 and display a message accordingly, as you wish. 

     # wfile is a file-like object. writing data to it will send it to the client 
     self.wfile.write(data) 

     # XXX: Obviously, you might want to send the file in segments instead of loading it as a whole 


if __name__ == '__main__': 

    PORT = 8080 # XXX 

    try: 
     server = SocketServer.ThreadingTCPServer(('', 8080), RequestHandler) 
     server.serve_forever() 
    except KeyboardInterrupt: 
     server.socket.close() 
+0

Merci pour la réponse. Comme je viens de commencer à apprendre Python, je ne comprends pas vraiment cela. J'ai exécuté ce code localement sur ma machine, en remplaçant test.py par a5.pdf et par l'adresse Web 127.0.0.1:8080. Le script a été invité à télécharger un fichier mais a téléchargé un fichier avec l'extension .dmz.part. Comment l'obtenir pour télécharger le fichier entier? Pouvez-vous me diriger vers un bon tutoriel sur le sujet? – Ali

0

Vous devez envoyer la bonne réponse HTTP, contenant les données binaires et de rendre le navigateur réagir là-dessus.

Essayez ceci (je n'ai pas) si vous utilisez Django:

response = HttpResponse() 
response['X-Sendfile'] = os.path.join(settings.MEDIA_ROOT, file.file.path) 
content_type, encoding = mimetypes.guess_type(file.file.read())    
if not content_type: 
    content_type = 'application/octet-stream'    
response['Content-Type'] = content_type    
response['Content-Length'] = file.file.size    
response['Content-Disposition'] = 'attachment; filename="%s"' % file.file.name 
return response 

Source: http://www.chicagodjango.com/blog/permission-based-file-serving/

+0

Merci pour la réponse. Je n'ai vraiment pas commencé django, donc je ne peux pas dire si ça va marcher. Pourriez-vous me montrer un bon tutoriel sur le sujet? Urllib.urlretrieve aide-t-il? – Ali

+0

Quel framework Web utilisez-vous? –

Questions connexes