Установка asp. net mvc файла excel и asp. net пересылки основного веб-API через mvc контроллер - PullRequest
0 голосов
/ 10 июля 2020

У меня есть проекты asp. net mvc и asp. net core 3.1 amazon s3. Я загружаю файл Excel в asp. net mvc, и этот файл Excel сохраняется в amazon s3. Я выполнил регистрацию на amazon s3 с asp. net core web api. Я использую ajaxForm для загрузки файлов. Я хочу попробовать направить процесс загрузки файла на asp. net core web api через mvc контроллер. Другая проблема, с которой я не могу справиться, - это сохранить данные, содержащиеся в файле, в базе данных sql после того, как файл Excel будет сохранен в amazon s3. Я пытался найти результаты из разных источников, но безуспешно. Как я могу это сделать?

Это мой MVC Код просмотра:

@using (Html.BeginForm("Index", "Admin", FormMethod.Post, new { enctype = "multipart/form-data", id = "Myform" }))
                {
                    <div class="form-group mb-3">
                        <div class="custom-file">
                            <input type="file" class="custom-file-input" id="FileUpload" name="FileUpload">
                            <label class="custom-file-label" for="FileUpload"></label>
                        </div>
                    </div>
                    <button type="submit" id="Submit" class="btn btn-primary"><i class="fa fa-upload" aria-hidden="true"></i> Yükle</button>
                    <button type="button" id="export" class="btn btn-primary"><i class="fa fa-file-excel-o" aria-hidden="true"></i> Excel'e Aktar</button>
                    <br /><br />
                    <ul id="ulList"></ul>
                }

Это мой javascript код:

$('#Myform').ajaxForm({
            beforeSend: function () {
                noFiles();
                $("#ulList").empty();
                $('.progress-bar').width(percentVal);
                loader_icon.show();
            },
            uploadProgress: function (event, position, total, percentComplete) {
                var fp = $("#FileUpload");
                var lg = fp[0].files.length; // get length
                var items = fp[0].files;
                var fragment = "";
                // disable button
                $("#Submit").prop("disabled", true);
                // add spinner to button
                $("#Submit").html(
                    `<span style="@@keyframes spinner-border {
  to { transform: rotate(360deg); }
}
.spinner-border{
    display: inline-block;
    width: 2rem;
    height: 2rem;
    vertical-align: text-bottom;
    border: .25em solid currentColor;
    border-right-color: transparent;
    border-radius: 50%;
    -webkit-animation: spinner-border .75s linear infinite;
    animation: spinner-border .75s linear infinite;
}
.spinner-border-sm{
    height: 1rem;
    border-width: .2em;
}" class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Yükleniyor...`
                );
                if (lg > 0) {

                    fragment += "<li> Veriler yükleniyor..</li>";

                    $("#ulList").append(fragment);
                    for (var i = 0; i < lg; i++) {
                        var i = 0;
                        if (i == 0) {
                            i = 1;
                            var elem = document.getElementById("myBar");
                            var width = 0;
                            var id = setInterval(frame, 100);
                            function frame() {
                                if (width >= 100) {
                                    swal({
                                        title: "Başarılı!",
                                        text: "Kayıt Başarılı!",
                                        type: "success",
                                        showCancelButtonClass: "btn-primary",
                                        confirmButtonText: "OK"
                                    });
                                    clearInterval(id);
                                    i = 0;
                                    elem.style.width = "0%";
                                    $("#Submit").prop("disabled", false);
                                    $("#export").prop("disabled", false);
                                    $("#Submit").html("Yükle");
                                    $("#ulList").empty();
                                    var lastFile =$("#onceki").val();
                                    console.log(lastFile);
                                    var prevFile = $("#oncekii").val();
                                    console.log(prevFile);
                                    $.cookie('oncekiYuklenenDosya', lastFile, { expires: 365 });
                                    $.cookie('dahaOncekiYuklenenDosya', prevFile, { expires: 365 });

                                    @*$.ajax({
                                        type: "GET",
                                        url: '@Url.Action("AddMap","Admin")',
                                        success: function (data) {
                                            console.log(data);
                                        },
                                        error: function (error) {
                                            alert(error);
                                        }
                                    });*@

                                    //var myUrl = "myApiUrl";
                                    //var formData = new FormData();
                                    //formData.append("FileUpload", $("#FileUpload").file);
                                    // $.ajax({
                                    //    type: "POST",
                                    //     url: myUrl,
                                    //     data: formData,
                                    //     crossDomain: true,
                                    //     dataType: 'html',
                                    //     contentType: "multipart/form-data",
                                    //     headers: {
                                    //         //Authorization: "Bearer " + accesstoken,
                                    //         'Access-Control-Allow-Origin': '*'
                                    //     },
                                    //    success: function (data) {
                                    //        alert(data);
                                    //    },
                                    //    error: function (error) {
                                    //        alert(error);
                                    //    }
                                    //});

                                    showMap();

                                } else {
                                    width++;
                                    elem.style.width = width + "%";
                                    elem.innerHTML = width + "%";
                                }
                            }
                        }
                    }
                }
            },
            complete: function (xhr) {
                if (xhr.success == true) {

                    swal({
                        title: "Başarılı!",
                        text: "Kayıt Başarılı!",
                        type: "success",
                        showCancelButtonClass: "btn-primary",
                        confirmButtonText: "OK"
                    });

                }
            }

        });

Это Контроллер mvc Я хочу перенаправить на веб-api:

[HttpPost]
    public ActionResult Index(FormCollection formCollection)
    {

            HttpPostedFileBase file = Request.Files["FileUpload"];
            var json = JsonConvert.SerializeObject(
                new
                {
                    files = file,
                    Passed = true,
                    Mesaj = "item added"
                },
                new HttpPostedFileConverter());


        var stringContent = new StringContent(json, Encoding.UTF8, "multipart/form-data");

        try
        {
            using (var client = new HttpClient())
            {
                //var userid = Session["UserID"];
                client.BaseAddress = new Uri("myApiUrl");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));
                //HttpResponseMessage response = await client.PostAsJsonAsync("api/address/postmap?mapList=" + mapList).Result;
                HttpResponseMessage response = client.PostAsync("api/address/save?FileUpload=", stringContent).Result;

                if (response.IsSuccessStatusCode)
                {
                    return RedirectToAction("Index", "Admin");
                }
                return null;
            }
        }
        catch (Exception e)
        {
            ViewBag.Hata = e.Message;
        }
        return RedirectToAction("Index", "Admin");
    }

Это мой asp. net веб-контроллер api ядра 3.1:

[HttpPost]
    [Route("api/address/save")]
    public async Task<IActionResult> Save(IFormFile FileUpload)
    {
        var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
        var uid = Convert.ToInt32(userId);
        if (FileUpload.Length == 0)
        {
            return BadRequest("please provide valid file");
        }
        var fileName = ContentDispositionHeaderValue
            .Parse(FileUpload.ContentDisposition)
            .FileName
            .TrimStart().ToString();
        var folderName = Request.Form.ContainsKey("folder") ? Request.Form["folder"].ToString() : null;
        bool status;
        using (var fileStream = FileUpload.OpenReadStream())

        using (var ms = new MemoryStream())
        {
            await fileStream.CopyToAsync(ms);
            status = await _awsS3Service.UploadFileAsync(ms, fileName, folderName);

            var mapList = new List<Map>();
            using (var package = new ExcelPackage(ms))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
                var rowCount = worksheet.Dimension.Rows;

                for (int row = 2; row <= rowCount; row++)
                {
                    mapList.Add(new Map 
                    {
                        UserId = uid,
                        Latitude = worksheet.Cells[row, 1].Value.ToString().Trim(),
                        Longitude = worksheet.Cells[row, 2].Value.ToString().Trim(),
                    });
                }
            }
            foreach (var item in mapList)
            {
                dbContext.Map.Add(item);
            }
            dbContext.SaveChanges();
        }
        return status ? Ok("success")
                     : StatusCode((int)HttpStatusCode.InternalServerError, $"error uploading {fileName}");
    }

Где вы думаете, что делаю ошибку? Спасибо.

1 Ответ

1 голос
/ 10 июля 2020

Хорошо, у вас есть несколько разных вопросов. Ответы включают несколько разных частей, как на стороне сервера (ваш C# ASP. Net Core UI и C#. Net Core контроллер), так и на стороне клиента (ваш ASP. Net Разметка Core / Razor и ваш Javascript).

Также: я использую термин «ASP. Net Core», чтобы отличить guish его от старого ASP. Net MVC ".

Давайте разберемся:

  1. MVC View code (я предполагаю, что это ASP. Net Core "Страница"): на первый взгляд выглядит нормально.

  2. javascript code: выглядит нормально. Но я не уверен, что он вам нужен ...

    Q: вы вызываете это из своего MVC кода просмотра? Если да, то как? Не могли бы вы нам показать? Если нет, то почему?

  3. mvc controller I want to redirect to the web api: Я не уверен, что это такое, и нужно ли оно вам вообще.

  4. asp.net core 3.1 web api controller: выглядит нормально ...

    ... но я думаю, вы можете перенести всю эту функциональность в ASP. Net Core обработчик «Post».

ПРЕДЛОЖЕНИЯ:

  1. Ваш начальный обработчик страницы «Индекс» будет выглядеть примерно так:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1

index.cs html:

<form enctype="multipart/form-data" method="post">
    <dl>
        <dt>
            <label asp-for="FileUpload.FormFile"></label>
        </dt>
        <dd>
            <input asp-for="FileUpload.FormFile" type="file">
            <span asp-validation-for="FileUpload.FormFile"></span>
        </dd>
    </dl>
    <input asp-page-handler="Upload" class="btn" type="submit" value="Upload" />
</form>
У вас будет обработчик «Post», который может выглядеть примерно так:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1

index.cs html .cs:

public async Task<IActionResult> OnPostUploadAsync(List<IFormFile> files)
{
    long size = files.Sum(f => f.Length);

    foreach (var formFile in files)
    {
        if (formFile.Length > 0)
        {
            var filePath = Path.GetTempFileName();

            using (var stream = System.IO.File.Create(filePath))
            {
                await formFile.CopyToAsync(stream);
            }
        }
    }

    // Process uploaded files
    // Don't rely on or trust the FileName property without validation.

    return Ok(new { count = files.Count, size });
}

Это удовлетворит ваше первое требование: загрузите файл на ваш. Net основной веб-сервер.

На самом деле не имеет значения, если файл окажется электронную таблицу Excel, изображение .jpg или текстовый файл - вы просто загружаете «файл».

Вы можете изменить свой обработчик «OnPostUploadAsyn c ()» для отправки файл в экземпляр S3, используя AWS SDK для. Net:

https://docs.aws.amazon.com/AmazonS3/latest/dev/HLuploadFileDotNet.html

Вы также можете изменить «OnPostUploadAsyn c ()» для записи файла в базу данных SQL:

https://www.c-sharpcorner.com/article/upload-files-in-azure-blob-storage-using-asp-net-core/

Если вы хотите иметь возможность выбрать «сохранить файл на сервер», «загрузить файл в S3» или «записать файл в MS SQL» во время выполнения, затем

  • Добавить переключатель или флажок в свой индекс .cs html разметка
  • Прочтите значение и вызовите соответствующий метод (ы) из вашего обработчика OnPostUploadAsyn c ().

https://en.wikipedia.org/wiki/ASP.NET_MVC

ASP. NET MVC - это прекращенная платформа веб-приложений, разработанная Microsoft, которая реализует модель – представление – контроллер. (MVC) узор. Это программное обеспечение с открытым исходным кодом, за исключением проприетарного компонента ASP. NET Web Forms.

ASP. NET Core, который объединил ASP. NET, ASP.NET MVC, ASP. NET веб-API и ASP. NET веб-страницы (платформа, использующая только страницы Razor). MVC 6 был заброшен из-за Core и не ожидается. Core в настоящее время планируется объединить в . NET 5 .

И помните -. Net Core (будь то страница ASP. Net Core "или. Net Core" контроллер ") - это просто уровень абстракции поверх HTTP-запросов и ответов. В конце концов, это всего лишь HTTP GET и POST. НЕ «Контроллеры», а не «Страницы».

Да, вы можете поместить обработчик POST-запроса в «контроллер» (вместо ASP. Net Ядро «Страницы»). Все, что вам нужно сделать, это 1) написать новый модуль контроллера, 2) использовать код ЖЕ , который я опубликовал выше, 3) убедиться, что вы определили маршрут к своему контроллеру, и 4) Сделайте так, чтобы ваш <form> использовал этот URL вместо адреса по умолчанию.

Easy peasy.

Но я призываю вас попробовать по-своему.

Заставьте его работать.

Затем, когда он заработает ... и когда вы лучше поймете КАК это работает, расширьте свое решение.

Сделайте «маленькие шаги» к вашему решению. Вот хорошая статья на эту тему:

https://blog.adrianbolboaca.ro/2013/01/the-history-of-taking-baby-steps/

Не расстраивайтесь.

Удачи.

...