2015-11-17 1 views
0

Je ne comprends pas, je ne comprends pas.mod_wsgi: Lire le contenu du fichier POSTed reste vide

Dans un framework web Python développé en interne, je poste un élément de formulaire de fichier sur le serveur en utilisant JavaScript.

var formData = new FormData(); 
formData.append('file', document.getElementById('file').files[0]); 
var request = new XMLHttpRequest(); 
request.open("POST", url, true); 
request.send(formData); 

Le serveur, mod_wsgi sportif, reçoit la demande comme ceci:

if environ['REQUEST_METHOD'] == 'POST': 
    post_env = environ.copy() 
    post_env['QUERY_STRING'] = '' 
    form = cgi.FieldStorage(
      fp=environ['wsgi.input'], 
      environ=post_env, 
      keep_blank_values=True) 

Puis, quand je veux accéder au contenu du champ de formulaire pour l'enregistrer dans un fichier, ce qui suit renvoie un vide résultat:

form['file'].file.read() 

(Tout le code a été modifié pour simplifier) ​​

Qu'est-ce que Je me demande si le champ de formulaire indiquera le bon nom de fichier et le type MIME, seul file.read() reste vide.

Toutes les autres informations des autres champs de texte de saisie sont également accessibles et accessibles. J'ai également vérifié que environ['REQUEST_METHOD'] est actuellement POST.

Quant à en-têtes HTTP pour l'encodage (tels que multipart/form-data), je pensais que l'objet XMLHttpRequest prendra soin de cela, une fois formData.append() reçoit une entrée de fichier en tant que valeur.

Répondre

0

Ok, voici la solution:

Je ne peux pas l'expliquer, mais les champs de formulaire de fichier se vide sur la première lecture, que j'ai découvert par hasard. Peut-être un bug, qui sait. J'ai supposé qu'ils resteraient intacts (comme toute autre variable) et peuvent être lus plusieurs fois.

Ce que j'ai ignoré, c'est que je leur ai en fait adressé plusieurs fois. La solution était donc de stocker d'abord le contenu du fichier dans une variable, puis de l'utiliser plusieurs fois.