Upload de fichier avec bac d'alimentation Supplémentaire de la Forme des Données à l'Api Web MVC
Je suis en train de télécharger un fichier avec d'autres données de formulaire et le poster à l'API Web via MVC, mais je ne pouvais pas accomplir.
MVC Côté
Tout d'abord j'ai reçu le formulaire soumis au MVC. Ici est l'action.
[HttpPost]
public async Task<ActionResult> Edit(BrandInfo entity) {
try {
byte[] logoData = null;
if(Request.Files.Count > 0) {
HttpPostedFileBase logo = Request.Files[0];
logoData = new byte[logo.ContentLength];
logo.InputStream.Read(logoData, 0, logo.ContentLength);
entity.Logo = logo.FileName;
entity = await _repo.Update(entity.BrandID, entity, logoData);
}
else
entity = await _repo.Update(entity,entity.BrandID);
return RedirectToAction("Index", "Brand");
}
catch(HttpApiRequestException e) {
//logging, etc
return RedirectToAction("Index", "Brand");
}
}
Code ci-dessous post les Multipartform à l'API Web
string requestUri = UriUtil.BuildRequestUri(_baseUri, uriTemplate, uriParameters: uriParameters);
MultipartFormDataContent formData = new MultipartFormDataContent();
StreamContent streamContent = null;
streamContent = new StreamContent(new MemoryStream(byteData));
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") {
FileName = "\"" + fileName + "\"",
Name = "\"filename\""
};
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
formData.Add(streamContent);
formData.Add(new ObjectContent<TRequestModel>(requestModel, _writerMediaTypeFormatter), "entity");
return _httpClient.PutAsync(requestUri, formData).GetHttpApiResponseAsync<TResult>(_formatters);
Comme vous pouvez le voir je suis en train d'envoyer un fichier de données et de l'objet avec le même MultipartFormDataContent
. Je ne pouvais pas trouver une meilleure façon d'envoyer ma entité ObjectContent
. Aussi, je suis en utilisant JSON.Net Sérialiseur
Quant à fiddler, poste semble réussie.
PUT http://localhost:12836/api/brand/updatewithlogo/13 HTTP/1.1
Content-Type: multipart/form-data; boundary="10255239-d2a3-449d-8fad-2f31b1d00d2a"
Host: localhost:12836
Content-Length: 4341
Expect: 100-continue
--10255239-d2a3-449d-8fad-2f31b1d00d2a
Content-Disposition: form-data; filename="web-host-logo.gif"; name="filename"
Content-Type: application/octet-stream
GIF89a��L������X�������wW����������xH�U�)�-�k6�������v6�������̥�v�J���������7����V:�=#�ի�I(�xf�$�������
//byte data
//byte data
'pf�Y��y�ؙ�ڹ�(�;
--10255239-d2a3-449d-8fad-2f31b1d00d2a
Content-Type: application/json; charset=utf-8
Content-Disposition: form-data; name=entity
{"BrandID":13,"AssetType":null,"AssetTypeID":2,"Logo":"web-host-logo.gif","Name":"Geçici Brand","Models":null,"SupplierBrands":null}
--10255239-d2a3-449d-8fad-2f31b1d00d2a--
Web API Côté
Enfin, je suis d'attraper la poste, à l'API Web de côté et d'essayer de l'analyser, mais je ne pouvais pas. Parce que MultipartFormDataStreamProvider
's FileData
et FormData
collections sont toujours vides.
[HttpPut]
public void UpdateWithLogo(int id) {
if(Request.Content.IsMimeMultipartContent()) {
var x = 1; //this code has no sense, only here to check IsMimeMultipartContent
}
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
try {
//Read the form data.
Request.Content.ReadAsMultipartAsync(provider);
foreach(var key in provider.FormData.AllKeys) {
foreach(var val in provider.FormData.GetValues(key)) {
_logger.Info(string.Format("{0}: {1}", key, val));
}
}
//This illustrates how to get the file names.
foreach(MultipartFileData file in provider.FileData) {
_logger.Info(file.Headers.ContentDisposition.FileName);
_logger.Info("Server file path: " + file.LocalFileName);
}
}
catch(Exception e) {
throw new HttpApiRequestException("Error", HttpStatusCode.InternalServerError, null);
}
}
J'espère que vous pouvez aider à trouver mon erreur.
Mise à JOUR
J'ai aussi réalisé que, si j'en commentaire StreamContent
ou ObjectContent
et ne fait qu'ajouter StringContent, je ne peux pas obtenir quelque chose de MultipartFormDataStreamProvider
.
OriginalL'auteur bahadir arslan | 2013-03-26
Vous devez vous connecter pour publier un commentaire.
Finalement j'ai résolu mon problème et il était tout au sujet de async 🙂
Comme vous pouvez le voir à l'API de méthode d'action que j'avais appelé
ReadAsMultipartAsync
méthode synchrously mais ce fut une erreur. J'ai eu à appeler avecContinueWith
donc j'ai modifié mon code comme ci-dessous mon problème est résolu.Ah, j'ai oublié que la restriction.
Je suis désolé, je suis un peu confus ici. Qu'est-ce que la tâche exactement? et je doit aussi accepter les données du formulaire, ici aussi ?
Peut-être que vous avez touché? stackoverflow.com/questions/15201255/...
Je voudrais voir l'ensemble du travail UpdateWithLogo corps si c'est possible
OriginalL'auteur bahadir arslan