Как проверить, отсутствует ли содержимое файла в File Upload Web API - PullRequest
0 голосов
/ 07 мая 2018

У меня есть веб-API для загрузки одного файла, который отправляется вдоль тела запроса. У меня есть код ниже, чтобы прочитать двоичные файлы из потока

Task<HttpResponseMessage> task = Request.Content.ReadAsStreamAsync().ContinueWith<HttpResponseMessage>(t =>
        {
            if (t.IsFaulted || t.IsCanceled)
                throw new HttpResponseException(HttpStatusCode.InternalServerError);
            try
            {
                using (Stream stream = t.Result)
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        stream.Seek(0, SeekOrigin.Begin);
                        stream.CopyTo(ms);
                        byte[] fileBinaries = ms.ToArray();
                        //logic to process the file
                    }
                }
            }
            catch (Exception e)
            {
                //exception handling logic
            }
            return Request.CreateResponse(HttpStatusCode.Created);
        });
        return task;

API работает нормально при вызове с загружаемым файлом; и возвращает Http код состояния 201 . Но если я не прикрепил файл к вызову API, он все равно возвращает тот же код, что и нет проверки на полученные двоичные данные. Я хочу добавить эту проверку, чтобы вернуть соответствующее сообщение об ошибке пользователю.

Я попытался выполнить эту проверку, оценив длину байтового массива fileBinaries, прочитанного из Request.Content. Но в массиве есть несколько байтов, которые представляют текст [объект FileList] (не знаю, как эти байты заполняются в массиве, так как я не прикрепил ни один файл с вызовом API). Так что это не сработает для меня.

Я также пытался использовать HttpContext.Current.Request.Files.Count , но он всегда возвращает 0 (возможно, из-за двоичных файлов, отправленных в теле запроса), поэтому не подходит для моей проверки.

Я не могу полагаться ни на какие заголовки, такие как Имя файла , так как они не отправляются в запросе.

Любая помощь, как это сделать?

1 Ответ

0 голосов
/ 07 мая 2018

Попробуйте использовать MultipartMemoryStreamProvider, который идеально подходит для загрузки файлов с использованием webapi

public async Task<IHttpActionResult> UploadFile()
{

    var filesReadToProvider = await Request.Content.ReadAsMultipartAsync();

    foreach (var stream in filesReadToProvider.Contents)
    {
        var fileBytes = await stream.ReadAsByteArrayAsync();
    }
}

Здесь fileBytes может не иметь этих 17 байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...