WebRequest POST avec les deux fichiers et de paramètres
Je suis en train de télécharger un fichier et l'envoyer un peu d'paramètres de mon site en utilisant .NET /C#. Après avoir lu quelques tutoriels qui ne soit quelques paramètres ou un fichier, j'ai essayé, en vain, de les combiner entre eux. Voici comment j'essaie de le faire:
WebRequest req = WebRequest.Create(baseURL + "upload");
req.Credentials = new NetworkCredential(username, password);
String boundary = "B0unD-Ary";
req.ContentType = "multipart/form-data; boundary=" + boundary;
req.Method = "POST";
((HttpWebRequest)req).UserAgent = "UploadTester v0.1";
string postData = "--" + boundary + "\nContent-Disposition: form-data\n";
postData += "myId=123&someFk=456";
postData += "\n--" + boundary + "\nContent-Disposition: form-data; name=\"file\" filename=\"upload.pdf\" Content-Type: application/pdf\n\n";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
byte[] filedata = null;
using (BinaryReader reader = new BinaryReader(File.OpenRead("myfile.pdf")))
filedata = reader.ReadBytes((int)reader.BaseStream.Length);
req.ContentLength = byteArray.Length + filedata.Length;
req.GetRequestStream().Write(byteArray, 0, byteArray.Length);
req.GetRequestStream().Write(filedata, 0, filedata.Length);
WebResponse response = req.GetResponse();
Stream data = response.GetResponseStream();
StreamReader sReader = new StreamReader(data);
String sResponse = sReader.ReadToEnd();
response.Close();
Quand je l'execute, je reçois un 500 exception, en disant: "section d'en-Tête a plus que 10240 bnytes (peut-être qu'il n'est pas correctement terminé)" et Wireshark m'informe que la demande a été envoyé un paquet mal formé, où le MIME multipart a été mal formé.
Il y a probablement plusieurs problèmes, de sorte s'il vous plaît laissez-moi savoir à tous les problèmes que vous pouvez repérer
Mise à jour: pour séparer MIME à partir de C#/.NET, j'ai donné naissance à un fil ici: https://stackoverflow.com/questions/1880002/error-in-mime-packet-for-http-post
Mise à jour 2: Si le backend, en effet, a des problèmes avec la longueur du contenu, en disant que le nombre d'octets disponibles pour la lecture est inférieure à la teneur indiquée la longueur. MAIS! Si je réduis la longueur du contenu dans req.ContentLength en conséquence, je n'ai pas une mémoire tampon de taille suffisamment grande pour l'envoi des données. Des suggestions?
Mise à jour 3: en Fait, il ressemble à l'en-tête a une trop grande taille par rapport à la quantité de données qu'il contient
OriginalL'auteur niklassaers | 2009-12-09
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est qu'il vous manque un '\n'. La ligne suivante:
devrait être:
Et cette ligne:
manque un '\n' avant 'Content-Type'. Il doit être:
whn-je utiliser cette reçois en plusieurs parties: la finale de limite de prévu ? Aucune idée sur comment résoudre ce problème ?
OriginalL'auteur
Je suppose que le problème immédiat est une incohérence entre la déclaration et la longueur réelle.
Où avez-vous mal calculé, je ne suis pas sûr, mais si je me souviens bien, la longueur doit inclure tous les octets de la réponse (y compris les en-têtes), sauf pour la première ligne.
Pour être sûr que je voudrais construire une page html simple pour générer le message que vous voulez et a examiné le post avec un violon (ou firebug)
Hmm, mais ma longueur de contenu est correctement configuré pour 129597 octets, et non pas n'importe où près de 10240. :-Je
Au lieu d'écrire à la demande de flux, je voudrais écrire à un filestream, et de voir combien d'octets sont là, et assurez-vous que la longueur du contenu des matches. Ou alternativement, d'écrire dans un MemoryStream, alors vous pouvez faire un memoryStream.ToArra() et obtenir la longueur du contenu.
Est-ce que chaque partie possède sa propre contenu de l'en-tête de longueur? si pas il n'y aura aucun moyen de dire d'où binaires partie se termine
OriginalL'auteur
Essayer de changer
à
Et mieux aussi remplacer tous les \n \r\n. Au moins deux premiers retours à la ligne a fonctionné pour moi la résolution de "section d'en-Tête a plus que 10240 octets (peut-être qu'il n'est pas correctement terminé)" problème.
Et ce code n'a pas l'air correct:
Mon code objective-C pour iPhone application que j'utilise et qui fonctionne ressemble maintenant à ceci:
Espère que cela aide quelqu'un.
OriginalL'auteur