Не удается отправить файл из действия контроллера в браузер для загрузки - PullRequest
0 голосов
/ 19 мая 2019

Я отправляю XMLHttpRequest на MVC Controller, и я ожидаю получить файл в результате. При отладке в браузере я получаю response, это нормально, но я не знаю, почему это не файл:

JS

 window.submit=function () {
                return new Promise((resolve, reject) => {
                    var form = document.getElementById("newTestForm");
                    var data = new FormData(form);
                    var xhr = new XMLHttpRequest();


                    var method = form.getAttribute('method');
                    var action = form.getAttribute('action');
                    xhr.open(method, action);
                    xhr.onload = function () {
                        if (this.status >= 200 && this.status < 300) {
                            resolve(xhr.response); //response looks ok...but no file starts downloading
                        }
                        else if (xhr.status != 200) {
                            reject("Failed to submit form with status" + xhr.status);
                        }
                    }
                    xhr.send(data);
                });
            }

Контроллер

    [HttpPost]
    [Route([Some Route])]
    public  async Task  BenchAsync(object request)
    {
        try
        {
            string fileName = "results.txt";

            object result = await service.RunAsync(request);
            byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(result)); 
            this.Response.ContentType = "application/octet-stream";
            this.Response.ContentLength = data.Length;

            using(MemoryStream stream=new MemoryStream(data))
            {
                await stream.CopyToAsync(this.Response.Body);
            }
        }
        catch (Exception ex)
        {
            throw;

        }
    }

1 Ответ

0 голосов
/ 21 мая 2019

Я решил это благодаря этому Посту

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

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

 window.submit= function () {
        return new Promise((resolve, reject) => {
            var form = document.getElementById("newTestForm");
            var data = new FormData(form);
            var xhr = new XMLHttpRequest();


            var method = form.getAttribute('method');
            var action = form.getAttribute('action');
            xhr.open(method, action);
            xhr.onload = function () {
                if (this.status >= 200 && this.status < 300) {
                    var blob = new Blob([this.response], { type: 'image/pdf' });

                    let a = document.createElement("a");
                    a.style = "display: none";
                    document.body.appendChild(a);

                    let url = window.URL.createObjectURL(blob);
                    a.href = url;
                    a.download = 'mytext.txt';

                    a.click();

                    window.URL.revokeObjectURL(url);
                }
                else if (xhr.status != 200) {
                    reject("Failed to submit form with status" + xhr.status);
                }
            }
            xhr.send(data);
        });
    }

PS Я не знаю, какой тип BLOB-объекта назван по имени txt но это работает так же, учитывая правильное расширение.

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