Получение fileName из HttpRequest - PullRequest
0 голосов
/ 03 марта 2019

По сути, мое приложение должно быть в состоянии обрабатывать загрузки больших файлов, и для этого я рассмотрел документы File uploads от Microsoft .

Здесь упоминаются загрузки больших файлов с потоковой передачей, которыезвучало хорошо, поэтому я скопировал код из документов.Однако моя проблема заключается в том, что я не могу получить исходные реквизиты загруженного файла (FileName, Length и т. Д.) Из HttpRequest.

Я уже пытался получить доступ к request.Form.Files, но таким образом я получаю исключение:IOException: Unexpected end of Stream, the content may have already been read by another component. Поскольку после этого я снова пытаюсь получить доступ к запросу.

Какой лучший способ получить FileName + Length после завершения загрузки (с потоковой передачей, конечно)?

Редактировать:

Код контроллера в настоящее время выглядит следующим образом:

[Authorize]
[Route("api/[controller]")]
public class FileController : Controller
{
    private FileManagerDbContext _context;
    public FileController(FileManagerDbContext context) {
        _context = context;
    }

    [HttpPost("upload")]
    [DisableFormValueModelBinding]
    public async Task<IActionResult> Upload()
    {
        using (var stream = System.IO.File.Create("myfile.temp"))
        {
            await Request.StreamFile(stream);
        }
        var fileToSave = new File();
        fileToSave.FileName = null;
        fileToSave.FileSize = 0;
        fileToSave.UploadDate = new DateTime();
        _context.Files.Add(fileToSave);
        _context.SaveChanges();

        return Ok(fileToSave);
    }

}

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

Ответы [ 4 ]

0 голосов
/ 04 марта 2019

Вы также можете перемотать внутри контроллера, если хотите:

if (request?.ContentLength != null)
{
    request.EnableRewind();

    request.Body.Seek(0, SeekOrigin.Begin);

    using (var reader = new StreamReader(request.Body, Encoding.UTF8))
    {
        body = reader.ReadToEnd();

        //Do your thing with the body content
    }

}
0 голосов
/ 03 марта 2019

Хорошо, я нашел обходной путь, чтобы включить перемотку HttpRequest.Для этого мне нужно было добавить этот фрагмент кода в Startup.cs:

app.Use(async (context, next) => {
    context.Request.EnableRewind();
    await next();
});

. Таким образом, исключение UnexpectedEndOfStream не будет выдано, поскольку поток можно перематывать.

0 голосов
/ 03 марта 2019

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

            var webRequest = HttpWebRequest.Create(url);

            using (var webResponse = webRequest.GetResponse())
            {
                var file_size = webResponse.Headers.Get("Content-Length");
                var file_name = webResponse.ResponseUri.Segments.Last();
            }
0 голосов
/ 03 марта 2019

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

[DisableFormValueModelBinding]

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