Символы преобразуются во время загрузки файла - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь загрузить файл (PDF) с веб-сайта в базовую службу ASP.NET Core.

Первые 40 байт моего тестового файла: 37, 80, 68, 70,45, 49, 46, 52, 13, 37, 226, 227, 207, 211 , 13, 10, 53, 48, 32, 48, 32, 111, 98, 106, 13, 60,60, 47, 76, 105, 110, 101, 97, 114, 105, 122, 101, 100, 32, 49

Сначала я попытался загрузить файл с помощью простого тега формы:

<form action=".../document/add/" method="post" id="dp-add-document" enctype="multipart/form-data">
    <!-- ... -->
    <div class="mdc-layout-grid__cell mdc-layout-grid__cell--span-12">
        <input id="file-upload-file" type="file" name="File">
    </div>
    <!-- ... -->

    <div class="mdc-layout-grid__cell mdc-layout-grid__cell--span-12 dmc-form__actions">
         <button id="submit" class="mdc-button mdc-ripple-upgraded" type="submit">Ok</button>
    </div>
</form>

Для получения файла я использовал следующее (dto содержит некоторую дополнительную информацию, которую пользователь должен ввести

[HttpPost("add/", Name = nameof(DocumentController) + "." + nameof(AddDocument))]
async public Task<object> AddDocument([FromForm] AddDocumentDto data)
{
    byte[] buff = new byte[40];
    data.File.OpenReadStream().Read(buff, 0, 40);

    var ids = String.Join(", ", buff.Select(x => x.ToString()).ToArray());
}

Строка ids содержит следующее: 37, 80, 68,70, 45, 49, 46, 52, 13, 37, 239, 191, 189, 239, 191, 189, 239, 191, 189, 239, 191, 189 , 13, 10, 53,48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 76, 105, 110, 101

Как видно, каждый байт выше 128 преобразуется в 239, 191,189.

После некоторого веселья с Google безрезультатно я попытался загрузить файл с помощью JavaScript:

$('#file-upload-file').on('change', function (event) {
    _fileToUpload = event.target.files[0];

    $.ajax({
        url: '../upload/',
        type: 'POST',
        data: _fileToUpload,
        processData: false,
        contentType: 'application/octet-stream',  /* charset=ISO-8859-1 */
        success: function () {
            alert('upload ok');
        },
        error: function () {
            alert('upload error');
        }
    });
}

Для этого JavaScript-путь я написал новое действие внутри моего контроллера:

[HttpPost("upload", Name = nameof(DocumentController) + "." + nameof(UploadDocument))]
async public Task<object> UploadDocument()
{
    var stream = Request.Body;

    byte[] buff = new byte[40];
    stream.Read(buff, 0, 40);

    var ids = String.Join(", ", buff.Select(x => x.ToString()).ToArray());
}

Но это то же самое. Серверная часть получает неправильные значения, и файл PDF не является допустимым PDF-документом: 37, 80, 68, 70, 45, 49, 46, 52, 13, 37, 239, 191, 189, 239, 191. 189, 239, 191, 189, 239, 191, 189 , 13, 10, 53, 48, 32, 48, 32, 111, 98, 106, 13, 60, 60, 47, 76, 105,110, 101

Как видите, я пытался использовать кодировку при загрузке, но это не решило мою проблему. Я думаю, что это небольшая проблема с кодировкой, но я не могу это исправить. Кто-нибудь может мне помочь?

...