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����������xHU�)�-�k6�������v6�������̥�vJ���������7����V:�=#�ի�I(�xf$�������
//byte data
//byte data
'pfY��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.

Je suis tombé sur une question un peu différente - le navigateur était à la baisse mes fichiers à partir de la Demande jusqu'à ce que je leur ai donné un nom/id. Cela m'a bien aidé à diagnostiquer la question si

OriginalL'auteur bahadir arslan | 2013-03-26