2012-09-25 1 views
1

Je suis confronté à un problème étrange avec le fichier apache benchmark post.Apache benchmark multipart/form-data

Je dois souligner une fonctionnalité qui gère le téléchargement de fichiers. Donc, j'ai googlé à propos, et j'ai trouvé un article décrivant comment construire un fichier post correctement. Son contenu ressemble à:

--1234567 
Content-Disposition: form-data; name="user_id" 

3 
--1234567 
Content-Disposition: form-data; name="file"; filename="cf_login.png" 
Content-Type: image/png 

[base64 encoded file content] 
--1234567-- 

La ligne ab est la suivante:

$ ab -c 1 -n 5 -v 4 -T 'multipart/form-data; boundary=1234567' -p post_file.txt http://localhost:3000/files 

Lorsque ab faire les demandes l'en-tête généré est le suivant:

INFO: POST header == 
--- 
POST /files.json/ HTTP/1.0 
Content-length: 229 
Content-type: multipart/form-data; boundary=simpleboundary 
Host: localhost:3000 
User-Agent: ApacheBench/2.3 
Accept: */* 


--- 
LOG: header received: 
HTTP/1.1 500 Internal Server Error 
Content-Type: text/html; charset=utf-8 
Content-Length: 13265 
X-Request-Id: 9ad57d19cd71886a1bb817d00fac651b 
X-Runtime: 0.015504 
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20) 
Date: Tue, 25 Sep 2012 13:54:29 GMT 
Connection: close 

Le rendement attendu est une augmentation params.inspect, ça me laisse voir si les données arrivent de l'autre côté. Si je supprime la limite, je peux voir les données reçues dans les paramètres, mais ce n'est pas ce que je veux. Je veux obtenir un téléchargement de fichier.

Est-ce que quelqu'un a un pourboire? Je vais vraiment l'apprécier.

Répondre

2

J'ai trouvé la réponse et j'ai décidé de partager avec vous. Après une lutte avec le fichier post, j'ai décidé de créer un script php juste pour afficher les variables $ _FILES et $ _REQUEST pour voir si le fichier a été construit correctement. En effet, apache reçoit le fichier parfaitement et je pouvais voir les données du fichier, et d'autres paramètres de requête.

Avec Rails la même chose ne se produit pas, et après avoir lu la documentation du sujet multipartie HTTP 1.1, je me rends compte que le problème était lié au format de fichier post. Lorsque vous avez construit ce type de fichier, vous devez le construire dans les détails, ce qui signifie inclure tous les caractères spéciaux comme \ r et \ n au bon endroit.

Ainsi, le fichier de message correct ressemble à ceci (le \ r \ n est pour illustration, mais devrait être là, vous savez?):

--boundary_hash\r\n 
Content-Disposition: form-data; name="your_form_field";\r\n 
Content-Type: text/plain\r\n 
\r\n 
your form field data\r\n 
--boundary_hash\r\n 
Content-Disposition: form-data; name="another_field";\r\n 
Content-Type: text/plain\r\n 
\r\n 
another field data\r\n 
--boundary_hash\r\n 
Content-Disposition: form-data; name="filename"; filename="cf_login.png"\r\n 
Content-Type: image/png\r\n 
\r\n 
base64 file content\r\n 
--boundary_hash--\r\n 

Lorsque vous ouvrez ce fichier, vous voyez ce fait:

--boundary_hash 
Content-Disposition: form-data; name="your_form_field"; 
Content-Type: text/plain 

your form field data 
--boundary_hash 
Content-Disposition: form-data; name="another_field"; 
Content-Type: text/plain 

another field data 
--boundary_hash 
Content-Disposition: form-data; name="filename"; filename="cf_login.png" 
Content-Type: image/png 

base64 file content 
--boundary_hash-- 

J'espère que cela vous aide.

Cheers.

+0

merci pour la mise à jour. – codecraig