से वेब एपीआई में Additonal फॉर्म डेटा के साथ फ़ाइल अपलोड करें मैं अतिरिक्त फॉर्म डेटा के साथ एक फ़ाइल अपलोड करने और एमवीसी के माध्यम से वेब एपीआई पर पोस्ट करने की कोशिश कर रहा हूं लेकिन मैं पूरा नहीं कर सका।एमवीसी
MVC साइड
सबसे पहले मैं MVC पर सबमिट किए गए फ़ॉर्म मिला है। इसके लिए यहां कार्रवाई है।
[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");
}
}
कोड पद Multipartform नीचे जाल एपीआई
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);
आप मैं एक ही MultipartFormDataContent
साथ फ़ाइल डेटा और वस्तु भेजने की कोशिश कर रहा हूँ देख सकते हैं करने के लिए
। मुझे अपनी इकाई को ObjectContent
के रूप में भेजने का बेहतर तरीका नहीं मिला। इसके अलावा मैं JSON.Net Serializer
फिडलर के संबंध में, पोस्ट सफल रहा है।
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--
वेब एपीआई साइड
अंत में मैं वेब एपीआई पक्ष में पद को पकड़ने कर रहा हूँ और पार्स करने का प्रयास, लेकिन मैं नहीं कर सकता। क्योंकि MultipartFormDataStreamProvider
के FileData
और FormData
संग्रह हमेशा खाली हैं।
[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);
}
}
मुझे आशा है कि आप मेरी गलती को ढूंढने में मदद कर सकते हैं।
अद्यतन
मैं भी महसूस किया कि, अगर मैं StreamContent
या ObjectContent
बाहर टिप्पणी और केवल जोड़ने StringContent, अभी भी मैं कुछ भी नहीं MultipartFormDataStreamProvider
से प्राप्त कर सकते हैं।
मैं थोड़ा अलग मुद्दा में भाग गया - ब्राउजर अनुरोध से मेरी फाइलें छोड़ रहा था जब तक कि मैंने उन्हें नाम/आईडी नहीं दिया। इसने समस्या का निदान करने में बहुत मदद की, हालांकि – brichins