Отправка файлов в WebApi2 с использованием AngularJS - не удается получить имя файла или заголовки

0

Я использую 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";
}

Как вытащить имя файла из загруженного файла?

Теги:
asp.net-web-api2

1 ответ

0

Из первой части кода кода то, что вы делаете, пытается имитировать объект запроса 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, вы всегда можете адаптировать его к вашим потребностям

Ещё вопросы

Сообщество Overcoder
Наверх
Меню