ASP.NET Основные страницы Razor загружают файл из AJAX Post

#javascript #jquery #ajax #asp.net-core

#javascript #jquery #ajax #asp.net-core

Вопрос:

Здравствуйте, у меня возникли проблемы с загрузкой файла из ASP.NET Основная страница Razor с использованием AJAX Post. То, что я хочу сделать, кажется повторяющимся простым, но оказалось настоящей болью.

  1. Я не хочу хранить файл на сервере, но я в порядке с временными данными и идентификатором guid, если это необходимо.

  2. Я хочу сделать ajax post, потому что я отправляю данные от клиента для сборки файла.

  3. Данные, отправленные на сервер, будут зашифрованы в строку, и это будет содержимое файла. (Примечание: шифрование уже работает)

  4. Я хочу, чтобы файл загружался как мое собственное расширение *.dat.

Вот мой asp.net метод core razor post.

 public IActionResult OnPostDownloadEncryptedFile([FromBody] List<FileData> fileData)
    {
        var response = ...THIS IS A REST WEB API CALL ASYNC I am calling .Result
       
        var byteArray = Encoding.ASCII.GetBytes(response.EncryptedData);
        var stream = new MemoryStream(byteArray);

        return this.File(stream, System.Net.Mime.MediaTypeNames.Application.Octet, "myfile.dat");
    }
  

Вот мой почтовый код Ajax:

 $.ajax({
        type: "POST",
        url: "/MySite/MyPage?handler=DownloadEncryptedFile",
        beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
        },
        data: JSON.stringify(myData),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            
        },
        error: function (response) {
            alert(response);
        }
    });
  

Я понимаю, что сообщение ajax, скорее всего, неполное и неправильное, не совсем уверен, как исправить, я видел, как другие использовали window.местоположение, но я не уверен, как это работает. Поскольку при отладке я никогда не мог попасть в функцию ajax post success.

Любая помощь будет высоко оценена.

Ответ №1:

У меня получилось, но я чувствую, что это ужасная реализация.

Вот что я сделал:

 public IActionResult OnPostEncryptFileData([FromBody] List<FileDataItem> fileData)
    {
        var response = this.restEndpoint.EncryptFileData(
            new FileDataEncryptionRequest()
            {
                FileDataListItems = new FileDataList() { FileDataItems = fileData.ToList() }
            }).Result;

        return new JsonResult(response.EncryptedData);
    }

    public FileResult OnGetDownloadEncryptedFile(string data)
    {
        var byteArray = Encoding.ASCII.GetBytes(data);
        return this.File(byteArray, "text/plain", "test.dat");
    }
  

Сообщение Ajax:

 $.ajax({
        type: "POST",
        url: "/MySite/MyPage?handler=EncryptFileData",
        beforeSend: function (xhr) { xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val()); },
        data: JSON.stringify(fileData),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            alert(response);
            window.location = "/MySite/MyPage?handler=DownloadEncryptedFileamp;data="   response;
        },
        failure: function (response) {
            alert(response);
        }
    });
  

Хотелось бы услышать несколько лучших решений.