Upload Múltiplos Arquivos com ASP.NET MVC e AJAX

Este artigo demonstra como implementar o upload de múltiplos arquivos em uma aplicação ASP.NET MVC utilizando AJAX.

Interface do Usuário (HTML) A interface HTML consiste em um formulário com um campo de seleção de arquivo que permite a escolha de múltiplos arquivos, uma barra de progresso e um botão para iniciar o upload.

<form id="uploadForm">
    <input type="file" id="fileSelector" name="selectedFiles" multiple />
    <progress id="uploadProgress" value="0" max="100"></progress>
    <span id="progressPercentage">0%</span>
    <button type="button" onclick="initiateUpload()">Carregar Arquivos</button>
</form>

Lógica de Upload do Lado do Cliente (JavaScript Puro) Utilizando JavaScript puro e o objeto XMLHttpRequest, podemos enviar os arquivos selecionados para o servidor e monitorar o progresso do upload.

<script type="text/javascript">
    function initiateUpload() {
        const fileInput = document.getElementById("fileSelector");
        const files = fileInput.files;
        const uploadEndpoint = "/Home/HandleUpload"; // URL do controller no servidor

        if (files.length === 0) {
            alert("Por favor, selecione arquivos para enviar.");
            return;
        }

        const formData = new FormData();
        // Adiciona dados extras, se necessário
        formData.append("uploaderName", "UserExample");

        // Adiciona cada arquivo selecionado ao FormData
        for (let i = 0; i < files.length; i++) {
            formData.append("uploadedFile" + i, files[i]);
        }

        const xhr = new XMLHttpRequest();
        xhr.open("POST", uploadEndpoint, true);

        xhr.onload = function () {
            if (xhr.status === 200) {
                alert("Upload concluído com sucesso!");
                // Opcionalmente, redirecionar ou atualizar a UI
                window.location.href = "/Home/Index";
            } else {
                alert("Ocorreu um erro durante o upload.");
            }
        };

        // Listener para o progresso do upload
        xhr.upload.addEventListener("progress", updateProgress, false);

        xhr.send(formData);
    }

    function updateProgress(event) {
        const progressBar = document.getElementById("uploadProgress");
        const percentageDisplay = document.getElementById("progressPercentage");

        if (event.lengthComputable) {
            progressBar.max = event.total;
            progressBar.value = event.loaded;
            const percentage = Math.round((event.loaded / event.total) * 100);
            percentageDisplay.textContent = percentage + "%";
        }
    }
</script>

Maniuplação do Upload no Servidor (C# - ASP.NET MVC) No lado do servidor, o controller ASP.NET MVC recebe os arquivos enviados e os salva no disco.

[HttpPost]
public ActionResult HandleUpload()
{
    // Obtém a coleção de arquivos enviados
    HttpFileCollectionBase uploadedFiles = Request.Files;

    // Itera sobre cada arquivo enviado
    for (int i = 0; i < uploadedFiles.Count; i++)
    {
        var currentFile = uploadedFiles[i];

        // Verifica se o arquivo não está vazio
        if (currentFile.ContentLength == 0) continue;

        // Define o caminho para salvar o arquivo no servidor
        // Certifique-se de que a pasta 'Upload' exista no seu projeto
        string savePath = Server.MapPath("~/Upload");
        string fileName = Path.GetFileName(currentFile.FileName);
        string fullPath = Path.Combine(savePath, fileName);

        // Salva o arquivo
        currentFile.SaveAs(fullPath);
    }

    // Redireciona para uma página após o upload
    return RedirectToAction("Index");
}

Implementação com jQuery (Alternativa) Uma alternativa utilizando jQuery simplifica a mainpulação do AJAX e do formulário.

<script type="text/javascript">
    $(document).ready(function () {
        $('#uploadForm').submit(function (event) {
            event.preventDefault(); // Previne o envio padrão do formulário

            const formData = new FormData();
            const files = $('#fileSelector')[0].files; // Acessa os arquivos

            // Adiciona os arquivos ao FormData
            for (let i = 0; i < files.length; i++) {
                formData.append("uploadedFile" + i, files[i]);
            }

            $.ajax({
                type: 'POST',
                url: '/Home/HandleUpload', // Mesma URL do controller
                data: formData,
                contentType: false, // Necessário para enviar FormData
                processData: false, // Necessário para enviar FormData
                success: function () {
                    alert('Upload realizado com sucesso via jQuery!');
                    // Atualizar UI ou redirecionar
                },
                error: function () {
                    alert('Falha no upload via jQuery.');
                }
                // O monitoramento de progresso pode ser adicionado aqui com xhr.upload.addEventListener
                // antes de chamar $.ajax, obtendo o objeto xhr retornado.
            });
        });

        // Opcional: um botão que chama a submissão do formulário
        // $("#submitButton").click(function() {
        //     $("#uploadForm").submit();
        // });
    });
</script>

Tags: ASP.NET MVC ajax javascript jQuery upload de arquivos

Publicado em 7-18 16:18