Проблема с сохранением загруженного файла на ASP. Net Core с помощью кнопки загрузки на интерфейсе пользователя. - PullRequest
0 голосов
/ 07 апреля 2020

Любая помощь с этим будет высоко ценится. У меня есть сетка данных и кнопка загрузки в моем интерфейсе. Когда пользователь выбирает строку в сетке и нажимает кнопку загрузки, он должен передать int id в качестве параметра моему методу загрузки на моем контроллере, который обрабатывает загрузку.

Я использовал Ajax / JQuery для этого, к чему я новичок. После отладки выясняется, что он отправляет два запроса GET, один с моим правильным идентификатором, а другой без, что приводит к сохранению пустого файла при загрузке. Если я набираю полный URL с идентификатором в браузере, он загружается правильно, и мой метод загрузки также работает в моем модульном тестировании, поэтому я думаю, что что-то не так в Ajax / JQuery.

Пожалуйста, смотрите соответствующий код ниже:

// html

            <form asp-controller="Home" asp-action="Download" method="get">
                <div id="downloadButton"></div>
            </form>

// JQuery сетка данных в моем представлении, которая вызывает метод getLoadId, когда пользователь выбирает строка данных:

    $("#gridContainer2").dxDataGrid({
        dataSource: DevExpress.data.AspNet.createStore({
            loadUrl: url + "/GetLoadHistory",
            key: "loadId"

        }),
        selection: {
            mode: "single"
        },
        hoverStateEnabled: true,
        paging: {
            pageSize: 10
        },

        editing: {
            mode: 'row',

        },
        onSelectionChanged: getLoadId
    });

// JQuery работает с Ajax, который передает выбранный loadId в контроллер:

function getLoadId() {
    var dataGrid = $("#gridContainer2").dxDataGrid("instance");
    var loadIds = dataGrid.getSelectedRowKeys();
    var loadId = loadIds[0];

    if (loadId > 0)
    {
        console.log("Load ID: " + loadId);
        download(loadId);

    }
}

function download(loadId) {
    $("#downloadButton").dxButton({
        text: "Download Selected",
        type: "default",
        icon: "/favicon.ico",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        useSubmitBehavior: true,
        onClick: function(e) {
            $.ajax({
                url: 'https://localhost:44346/home/Download/',
                type: 'GET',
                data: {
                    loadId: loadId
                }
            }).done(function() {
                DevExpress.ui.notify("Downloading results for Load ID: " + loadId, "info", 1500);
            });
        }
    });

    console.log("Load ID: " + loadId + " download processed");

};

// методы загрузки на домашний контроллер:

    [HttpGet]
    public async Task<IActionResult> Download(int loadId)
    {

        Console.WriteLine("Attempting to download Load ID: " + loadId + " from UI");

        var outputFolder = Directory.GetCurrentDirectory() + "\\wwwroot\\output\\";
        var name = GetFileName(loadId, outputFolder);
        var path = Path.Combine(outputFolder, name);

        var memory = new MemoryStream();

        try
        {
            using (var stream = new FileStream(path, FileMode.Open))
            { 
                await stream.CopyToAsync(memory);
            }

            memory.Position = 0;
        }

        catch (Exception e)
        {
            Log.Error($"Unable to copy load {loadId} to memory for download: " + e);
        }

        Log.Info($"Results for file load: " + loadId + " download triggered successfully");

        return File(memory, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Downloaded.xlsx");
    }


    public string GetFileName(int loadId, string outputFolder)
    {

        Log.Info($"Locating results for load {loadId} on web server");

        var resultsName = @"Results_Load_" + loadId + "_*";
        var results = "";
        var d = new DirectoryInfo(outputFolder);

        try
        {
            foreach (var file in d.GetFiles(resultsName))
            {
                Log.Info($"Results for load {loadId} located for download");
                results = file.Name;
            }
        }

        catch (Exception e)
        {
            Log.Error($"Results for load {loadId} not found on server: " + e);
            return null; 
        }

        return results; 

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