2009-10-11 8 views
3

La tâche est simple: du côté serveur (python), acceptez un HTTP POST qui contient un fichier téléchargé et plus de paramètres de formulaire. J'essaye d'implémenter l'indicateur de progression de téléchargement, et donc je dois être capable de lire le contenu de morceau chunk-by-chunk.python: parse Requête HTTP POST avec téléchargement de fichier et paramètres supplémentaires

Toutes les méthodes que j'ai trouvées sont basées sur cgi.FieldStorage, ce qui me permet en quelque sorte seulement d'obtenir le fichier dans son intégralité (en mémoire, ce qui est un désastre en soi). Certains conseillent de redéfinir la méthode FieldStorage.make_file(), qui semble décomposer l'implémentation de cgi (bizarre ...).

Je suis actuellement en mesure de lire l'intégralité de l'entrée wsgi, morceau par morceau, le système de fichiers, ce qui les données suivantes:

-----------------------------9514143097616 
Content-Disposition: form-data; name="myfile"; filename="inbound_marketing_cartoon_ebook.pdf" 
Content-Type: application/pdf 

... 1.5 MB of PDF data 

-----------------------------9514143097616 
Content-Disposition: form-data; name="tid" 

194 
-----------------------------9514143097616-- 

Est-ce que quelqu'un sait s'il y a des bibliothèques Python qui pourraient parser de manière fiable cette chose? Ou devrais-je le faire manuellement? (Python 2.5 c'est)

Merci.

Répondre

2

Comme vous l'avez suggéré, je voudrais (et l'ai déjà fait) remplacer la méthode make_file d'un objet FieldStorage. Renvoyez juste un objet qui a une méthode write qui accepte les données (dans un fichier ou une mémoire ou quoi que ce soit) et qui suit la quantité reçue pour votre indicateur de progression.

De cette manière, vous avez également accès à la longueur du fichier (tel que fourni par le client), au nom du fichier et à la clé sous laquelle il est enregistré.

Pourquoi cela semble-t-il dégrader la mise en œuvre de CGI pour vous? Une autre option est de faire le suivi de l'avancement dans le navigateur avec un uploader flash (YUI Uploader et SWFUpload) et de le suivre complètement sur le serveur. Il n'est alors pas nécessaire d'avoir une série de requêtes AJAX pour obtenir la progression.

1

Il semble contre-intuitif (et je pense que le module est mal nommé), mais email fera probablement ce que vous voulez. Je ne l'ai jamais utilisé, mais un collègue a dans un système de traitement de courrier électronique; Puisque ces messages sont simplement de nature RFC 2822, email les analysera probablement.

The documentation for email est assez complet, à première vue. Mon instinct serait de dire que vous allez probablement finir avec le fichier en mémoire, cependant, que vous avez exprimé votre chagrin.

0

Vous pourriez jeter un oeil à ce que Django a fait. Ils ont une très bonne implémentation de gestionnaires de téléchargement de fichiers, ce qui vous permet de les sous-classer pour activer des barres de progression, etc. Voir the documentation et the relevant code - même si vous ne voulez pas utiliser Django, cela vous donnera quelques idées.