System.IO.IOException: недопустимый аргумент при попытке сохранить FormFile в веб-API - PullRequest
0 голосов
/ 01 октября 2019

ОБНОВЛЕНИЕ : Кажется, проблема в Docker. При создании проекта с использованием IIS Express все работает как положено. Мне придется выяснить, почему Docker вызывает эту проблему.

Я пытаюсь сохранить изображение, которое отправляется в мой API, на локальный диск.

Но у меня возникают проблемыс фактическим хранением изображения. Я получаю System.IO.IOException при попытке сохранить его.

Вот метод API:

[HttpPost]
public IActionResult Post([FromForm] IFormFile file)
{
     var filePath = @"C:\" + file.FileName + ".png";
     if(file.Length > 0)
     {
         using (var stream = new FileStream(filePath, FileMode.Create))
         {
             file.CopyTo(stream);
         }
     }
     return Ok();
 }

Файл работает нормально, и если я отлаживаюсь в Visual Studio, я вижу, чтоэто правильный файл, который отправляется в. Код разрывается на строку new FileStream(filePath, FileMode.Create).

Я пробовал с разными путями, такими как C:\Pictures\ и C:\users\myuser\pictures\, но, похоже, ничего не работает.

Подробности исключения:

An exception of type 'System.IO.IOException' occurred in System.Private.CoreLib.dll but was not handled in user code: 'Invalid argument'
Stack trace:
 >   at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
 >   at System.IO.FileStream.OpenHandle(FileMode mode, FileShare share, FileOptions options)
 >   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
 >   at System.IO.FileStream..ctor(String path, FileMode mode)

1 Ответ

0 голосов
/ 01 октября 2019

Во-первых, попробуйте использовать асинхронную версию метода CopyTo -> await file.CopyToAsync(stream) только из соображений производительности.

Возможно, вы, вероятно, открыли этот файл в каком-то редакторе и получили сообщение об ошибке:

Процесс не может получить доступ к файлу 'путь к файлу', поскольку он используется другим процессом

Если это так, просто закройте редактор, в котором открыт файл, ивсе должно работать как положено.

Еще один совет : Вместо того, чтобы объединять, чтобы получить путь, попробуйте вместо этого использовать Path.Combine.

РЕДАКТИРОВАТЬ после комментариев: Как отметил @PanagiotisKanavos в комментарии:

c: \ what.png не подходит для Linux. А контейнер Docker будет иметь даже больше ограничений, чем IIS. Если вы хотите сохранить эти файлы, вам придется хранить их в сопоставленных хранилищах. Все остальное будет потеряно, когда контейнер закроется

...