Не удается правильно получить расширение файла в Web API - PullRequest
0 голосов
/ 19 сентября 2018

Я использую метод и без проблем извлекаю файлы, хранящиеся в базе данных, в сборке моего проекта на ASP.NET MVC и Angular:

[HttpPost]
public ActionResult GetFile(int id)
{
    var file= service.GetFileById(id);
    if (file.Data != null)
    {
        return File(file.Data, file.MimeType, file.Name);
    }
    return new EmptyResult();
}

С другой стороны, когда я хочу использовать то же самоеПодход в моем контроллере Web Api, такой метод File () не существует, и я попытался использовать следующий метод после просмотра решения 15-20 на stackoverflow:

[Route("api/Generate/{id}")]
[AcceptVerbs("GET", "POST")]
public HttpResponseMessage Generate(int id)
{
    var data = service.GetFileByName(id);
    var stream = new MemoryStream();

    var result = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new ByteArrayContent(stream.ToArray())
    };
    result.Content.Headers.ContentDisposition =
        new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
        {
            FileName = data.Name
        };
    result.Content.Headers.ContentType =
        new MediaTypeHeaderValue(data.MimeType);

    return result;
}

Однако, нетрасширение загруженных файлов, и я не нашел полезного метода для того, чтобы получить расширение файла из mime-типа, как показано ниже (этот метод получает тип файла из application / pdf, но не может получить, если mime-тип - application / octet-stream.Итак, есть идеи, чтобы решить эту проблему для Web Api ???

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Вам необходимо установить пакет Nuget, например MediaTypeMap или написать собственный метод, который возвращает .ext файла на основе MimeType.см. эту ссылку для всех деталей MIME.

Я добавил код для получения расширения файла, используя MediaTypeMap Nuget.

 using (MemoryStream stream = new System.IO.MemoryStream())
            {
                var result = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new ByteArrayContent(stream.ToArray())
                };
                result.Content.Headers.ContentDisposition =
                    new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                    {
                        FileName = data.Name + MimeTypeMap.GetExtension(data.MimeType)
                    };
                result.Content.Headers.ContentType = new MediaTypeHeaderValue(data.MimeType);
                var response = ResponseMessage(result);
                return response;
            }
0 голосов
/ 20 сентября 2018

Насколько я понимаю, вы хотите получить расширение вашего файла из информации о файле, которая у вас есть под рукой.Я думаю, что у вас есть содержимое двоичного файла, имя файла без расширения и тип MIME (он же тип контента).

Чтобы извлечь расширение из MIME-типа, вы можете использовать какой-то словарь сопоставления в качестве другихупомянул. Ответ Дивьянга Пателя показывает, как вы можете это сделать.

Дополнительной опцией будет эвристическое получение расширения (или типа MIME) из содержимого файла.Как правило, я бы не рекомендовал этот вариант, поскольку он требует значительных ресурсов, но я подумал, что упомяну его для полноты.

TrID - единственный вариант, о котором я лично знаю, чтобы сделать это,Я уверен, что есть другие.Есть CLI, .NET GUI и библиотека Nuget (неофициально, я думаю).

Вот пример использования пакета:

string extension = TrIDEngine.GetExtensionByFileContent(@"C:\path\to\file.???");

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

Для вашего случая использования, если вы решите пойти по этому пути, вот как это может работать:

  1. Записать содержимое файла во временную папку файловой системы (если у вас еще нет пути к файлу, который можно использовать для чтения файла).
  2. Используйте TrID для получения расширения.
  3. Отправка ответа клиенту, включая производное расширение файла и его содержимое.
  4. Удаление (или постановка в очередь на удаление) любых временных файлов, которые были записаны.

Inв любом случае, я бы старался хранить любые производные расширения файлов для последующих запросов.

0 голосов
/ 20 сентября 2018

Если хранить имена файлов с расширениями в db невозможно, то вам следует рассчитать расширение по типу mime.

Здесь является ответом об обратном решении.Вы можете использовать свою собственную таблицу сопоставления.Но если для определенного типа MIME будет несколько расширений, вам следует решить, какой из них выбрать

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