2011-06-01 3 views
2

Je télécharge actuellement sur un serveur web nginx à l'aide du module de téléchargement (http://www.grid.net.ru/nginx/upload.en.html) à partir d'une application de bureau personnalisée effectuant un POST en multipart simple qui envoie un fichier en une partie et un XML codé en base64 avec les métadonnées du fichier dans une autre partie.Chargement nginx resumable avec upload_module et multipart/form

Le serveur reçoit ce POST, le transmet à mon service Web qui lit les métadonnées, traite le fichier et tout est bon. Ce que je veux faire maintenant, c'est utiliser la directive upload_resumable du module de téléchargement pour faire le POST en plusieurs morceaux afin de minimiser les chances de déconnexion et permettre la reprise. Je peux actuellement faire ceci suivant le protocole décrit ici: http://www.grid.net.ru/nginx/resumable_uploads.en.html

On envoie des rangées d'octets du dossier avec quelques en-têtes pour identifier le morceau et la session dans plusieurs poteaux et une fois toutes les parties ont été téléchargées, nginx composera le POST final contenant le nom et le chemin du fichier et le transmettre à votre emplacement upload_pass (dans mon cas, CGI à une application django).

Cependant, je ne suis pas clair sur la façon dont on enverrait une publication multipart avec cette méthode puisque le protocole indique que le corps du POST doit être les octets indiqués dans la gamme d'octets. J'ai besoin de la publication finale pour contenir également le XML que j'ai écrit ci-dessus. Je peux penser à envoyer le XML comme les premiers octets du corps et un en-tête qui indique combien d'octets lui appartiennent mais cela signifierait une manipulation supplémentaire du fichier final pour supprimer cet en-tête et les fichiers finaux sont potentiellement dans la gamme de taille GB.

D'autres idées?

Répondre

2

Puisque le protocole supporté par nginx stipule spécifiquement que la publication ne doit pas être multipart, j'ai fini par envoyer le fichier dans le corps, et le reste des paramètres codés dans l'URL. Pas les plus belles URL mais ça marche.

+0

qu'avez-vous implémenté pour un client? était-ce flash? – emh

+0

J'ai quelques clients, l'un est en RealBasic en utilisant un HTTPSocket personnalisé et l'autre en Python, en utilisant le module Requests. –