Возвращение файла, прочитанного в MemoryStream для загрузки в ajax C # - PullRequest
0 голосов
/ 10 декабря 2018

Я создал файл Excel в приложении C #, используя OpenXML.Впоследствии я прочитал его в тип MemoryStream.Теперь я хочу вернуть этот файл для загрузки из функций C #, которые возвращают тип ActionResult.Данные возвращаются в функцию ajax, где я ожидаю приглашения пользователя на загрузку, чтобы они могли сохранить этот файл, если захотят.Ниже приведен пример кода и вещи, которые я попробовал.

Моя цель с MemoryStream состояла в том, чтобы мне не нужно было хранить вышеупомянутый физический файл на сервере.Есть ли способ вернуть содержимое MemoryStream в функцию Ajax для загрузки?

Я не хочу использовать пробную версию 3, где я отправил путь к файлу функции ajax, где он использует его для перенаправления.Это, однако, работает, и я получаю сообщение для загрузки из веб-браузера IE.Но ничего не происходит для пробной версии 1 или пробной версии 2, за исключением, возможно, ошибки.

Это потому, что мне нужен физический файл на сервере для его загрузки.Не уверен, что Ajax-коду нужно что-то еще для Trial 1 или Trial 2 для работы.

Любые советы о том, как я должен делать это правильно, были бы очень полезны.Спасибо

public ActionResult createFile ()

{
...

// Reads a file into memory stream.  Common for all trials below
memoryStream = ReadDataIntoMemoryStream();

// TRIAL 1                
FileStream fs= new FileStream();
memoryStream.CopyTo(fs);

string mimeType = "application/vnd.openxmlformats-
                   officedocument.spreadsheetml.sheet";

return File(fs, mimeType);

// TRIAL 2
string mimeType = "application/vnd.openxmlformats-
                   officedocument.spreadsheetml.sheet";
byte[] fileBytes = memoryStream.ToArray();
return File(fileBytes, mimeType);

// TRIAL 3
string filepath = "..\...\..\filename.xlsx";  // actual physical file on 
                                              // the server
return Content(filepath);

}

Ajax

$(document).ready(function () {
    $('#777').on('click', function () {
        $.ajax({
            method: "GET",
            url: "Report/createFile",
            contentType: "application/download",  // not needed for Trial 3 
                                                  // where string is returned
            dataType:"text",
            success: function (data) {
            // window.location.href = data;  // THIS WORKS with TRIAL 3 
                                             // where filepath is returned
             },
            error: function (data) {
                alert("Error.");
            },
        });
    });
});

1 Ответ

0 голосов
/ 11 декабря 2018

Хорошая работа, показывающая вашу работу.

Когда вы закончите помещать контент в memoryStream, его свойство Position будет указывать на конец потока.Сбросьте его обратно в начало, и вы сможете читать с него.

memoryStream = ReadDataIntoMemoryStream();
memoryStream.Position = 0L;

Тогда вы сможете использовать метод File так, как вам нужно.

return File(memoryStream, mimeType, suggestedFileName);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...