Blazor
- Upload de
arquivos (InteractiveServer) - III
|
Neste artigo veremos como realizar o upload de arquivos no Blazor usando o modo de renderização InteractiveServer. |
Definindo o menu
Na pasta Components/Layout vamos ajustar o código do arquivo NavMenu conforme abaixo:
... <div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()"> <nav class="flex-column"> <div class="nav-item px-3"> <NavLink class="nav-link" href="" Match="NavLinkMatch.All"> <span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home </NavLink> </div> <div class="nav-item px-3"> <NavLink class="nav-link" href="uploadserver"> <span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Upload </NavLink> </div> <div class="nav-item px-3"> <NavLink class="nav-link" href="exibirarquivos"> <span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Ver Arquivos </NavLink> </div> </nav> </div> |
A seguir vamos incluir no arquivo _Imports.razor o código abaixo:
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using BlazorUploads
@using BlazorUploads.Components
@using BlazorUploads.Repositories
@using BlazorUploads.Services
@using BlazorUploads.Context
@using BlazorUploads.Entities
@using Microsoft.Net.Http.Headers
@inject HttpClient client
@inject IWebHostEnvironment env
@inject IUploadService _uploadService
@inject IUploadRepository _uploadRepository
|
Vamos ajustar o código do componente Home.razor conforme o código a seguir:
@page "/"
<PageTitle>Home</PageTitle>
<h1>Upload de arquivos</h1>
<img src="/uploads1.jpg"/>
|
Criando o componente para enviar arquivos
Vamos criar na pasta Components/Pages o componente UploadServer.razor que vai enviar arquivos para o servidor:
@page "/uploadserver"
@rendermode InteractiveServer
<h3>Upload de arquivos (InteractiveServer)</h3>
<EditForm Model="@arquivoUpload" OnValidSubmit="@HandleFormSubmit"
enctype="multipart/form-data">
Selecione até 5 arquivo(s): <InputFile OnChange="@SelectFiles" multiple />
<br />
<button type="submit">Enviar</button>
</EditForm>
@if (arquivos.Count > 0)
{
<li>Arquivos selecionados </li>
<ul>
@foreach (var arq in arquivos)
{
<li>@arq.Name @arq.Size bytes</li>
}
</ul>
}
<br />
<ul>
@foreach (var mensagem in mensagens)
{
<li>
@mensagem
</li>
}
</ul>
@code {
List<string> mensagens = new();
List<IBrowserFile> arquivos = new();
int tamanhoMaximoArquivo = 1 * 1024 * 1024; //1 MB
ArquivoUpload arquivoUpload = new();
List<ArquivoUpload> uploads = new();
private void SelectFiles(InputFileChangeEventArgs e)
{
arquivos = e.GetMultipleFiles(tamanhoMaximoArquivo).ToList();
}
private async Task HandleFormSubmit()
{
mensagens.Clear();
var extensoesPermitidas = new string[] { ".png", ".jpg", ".jpeg", ".gif" };
int contador = 0;
mensagens.Add("Arquivo(s) enviado(s) ");
foreach (var arquivo in arquivos)
{
try
{
(int statusCode, string statusMessage) =
await _uploadService.ArquivoUploadAsync(arquivo,
tamanhoMaximoArquivo,
extensoesPermitidas);
if (statusCode == 1)
{
mensagens.Add($" {arquivo.Name} ");
var arquivoDados = new ArquivoUpload
{
NomeArquivoUpload = statusMessage
};
// salva imagem no banco de dados
await _uploadRepository.UploadArquivoDb(arquivoDados);
uploads.Add(arquivoDados);
contador++;
}
else
{
mensagens.Add(statusMessage);
}
}
catch (Exception ex)
{
mensagens.Add($"Arquivo : {arquivo.Name} Erro : {ex.Message}");
}
}
mensagens.Add($" {contador}/{arquivos.Count} enviado(s)");
}
}
|
A seguir vamos criar o componente ExibirArquivos.razor usando o seguinte código:
@page "/exibirarquivos"
@rendermode InteractiveServer
<h3>Arquivos Armazenados</h3>
@if (arquivos != null && arquivos.Any())
{
<div class="file-list">
@foreach (var arquivo in arquivos)
{
<div class="file-item">
<img src="\uploads\@arquivo.NomeArquivoUpload" alt="arquivo" />
<p>@arquivo.NomeArquivoUpload</p>
<button @onclick="() => ExcluirArquivo(arquivo.Id)">Excluir</button>
</div>
}
</div>
}
else
{
<li>Nenhum arquivo encontrado</li>
}
@code{
private IEnumerable<ArquivoUpload>? arquivos;
protected override async Task OnInitializedAsync()
{
await CarregaImagens();
}
private async Task ExcluirArquivo(int arquivoId)
{
await _uploadRepository.DeletaArquivo(arquivoId);
arquivos = await _uploadRepository.GetArquivos();
}
private async Task CarregaImagens()
{
arquivos = await _uploadRepository.GetArquivos();
}
}
|
Este código exibe os arquivos salvos no banco de dados SQLite e permite excluir os arquivos da tabela sem contudo excluir os arquivos da pasta uploads.
Agora vamos definir um estilo vinculado a este componente criando o arquivo ExibirArquivos.razor.css com este código:
.file-list {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.file-item {
margin: 5px;
text-align: center;
}
img {
max-width: 120px; /* Tamanho máximo da imagem */
max-height: 120px;
border: 1px solid #ccc;
}
/*.file-item:hover {
transform: scale(3.0);
}*/
|
Executando o projeto teremos o seguinte resultado:
1- Pagina inicial

2- Enviando arquivos

3- Visualizando arquivos

Baixe o projeto
aqui :
https://github.com/macoratti/BlazorUploads-InteractiveServer ![]()
"Porque pela graça sois salvos, por meio da fé; e
isto não vem de vós, é dom de Deus.
Não vem das obras, para que ninguém se
glorie"
Efésios 2:8,9

Referências:
C# - Tasks x Threads. Qual a diferença
DateTime - Macoratti.net
Null o que é isso ? - Macoratti.net
Formatação de data e hora para uma cultura ...
C# - Calculando a diferença entre duas datas
NET - Padrão de Projeto - Null Object Pattern
C# - Fundamentos : Definindo DateTime como Null ...
C# - Os tipos Nullable (Tipos Anuláveis)