Я использую AngularJS, чтобы разрешить кому-то публиковать файл на моем веб-сервисе, который использует С# WebAPI 2.
self.AddDocument = function() {
var f = document.getElementById('documentFile').files[0];
var r = new FileReader();
r.onloadend = function(e) {
var data = e.target.result;
console.log('AddDocument data' + data);
var fd = new FormData();
fd.append('Attachment', f);
$http.post('api/Document/' + $routeParams.changeId + '/AddDocument',
fd, {
method: 'POST',
url: 'api/Document/' + $routeParams.changeId + '/AddDocument',
data: fd,
// I have tried application/x-www-form-urlencoded & application/octet-stream for the content type
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}).then(function(response) {
console.log(response.data);
});
};
r.readAsArrayBuffer(f);
};
}
Этот код отлично работает, насколько я могу судить по тому, что я получаю HttpRequestMessage в моем коде, проходящем через (см. Ниже), однако нет пропущенных заголовков, но я могу видеть содержимое, когда я читаю ReadAsStringAsync
[HttpPost]
[Route("api/Document/{id}/AddDocument")]
public async Task<string> Add(HttpRequestMessage request)
{
var doc = await request.Content.ReadAsByteArrayAsync();
var values = Enumerable.Empty<string>();
// this is always null
var header = (request.Content.Headers.TryGetValues(name: "filename", values: out values))
? values.First()
: null;
// this will be the following
/*
* ------WebKitFormBoundaryQIUoHBmcWJTY9cJx
Content-Disposition: form-data; name="Attachment"; filename="IMG_8639.JPG"
Content-Type: image/jpeg
*/
var str = await request.Content.ReadAsStringAsync();
// code that will add the byte array, filename, etc to a database table...
return "success";
}
Как вытащить имя файла из загруженного файла?
Из первой части кода кода то, что вы делаете, пытается имитировать объект запроса http и отправлять его в ваш веб-API. Затем в вашем стеке Web APi веб-интерфейс пытается сопоставить объект, который вы отправили, в встроенный объект HttpRequestMessage
.
public async Task<string> Add(HttpRequestMessage request)
эквивалентно:
public async Task<string> Add(FormData)
Параметр HttpRequestMessage
автоматически привязан, чтобы вы могли получить информацию о запросе в своем методе контроллера, если вам нужно
Я предполагаю, что вам нужно создать объект модели в С# (API-интерфейсе WEB), который напрямую привязывается к вашему объекту FormData, тогда стек API привяжет его правильно, вы можете передать заголовки в основном запросе $ http.Post и прочитать их в контроллере Web Api.
Надеюсь, это имеет смысл, я опубликовал весь код, поскольку я думаю, что проблема здесь заключается в понимании концепции. В качестве примера проверьте этот пример Git Hub, вы всегда можете адаптировать его к вашим потребностям