Utilizando drag in drop e parecendo o Dropbox
Olá pessoal, hoje eu vou mostrar como desenvolver um sistema MVC utilizando a linguagem C# da Microsoft e o Visual Studio como ferramenta; mostrando como fazer upload de arquivos apenas com drag in drop e com o resultado igual ao do Dropbox.
Utilizado:
- Linguagem C#
- Ferramenta Visual Studio
- Plataforma MVC Web
- JavaScript JQuery
- Stilo CSS
Veja como ficou no final:
Figura 1 - Resultado final
Existe uma área específica da tela que o usuário pode arrastar o arquivo desejado para envio pela Web browser. Esse envio os dados serão enviados pela HomeController.cs. Existe um método chamado EnviarArquivos e dentro dele é gerado um novo nome para o arquivo e salvo na pasta dentro do mesmo projeto chamada UploadedFiles.
Veja o código 1.1 mostrando a HomeController.cs.
Código 1.1 - Código da HomeController.cs using System; using System.Collections.Generic; using System.IO; using System.Web; using System.Web.Mvc;
namespace MVCDragDropUpload.Controllers
{
public class HomeController : Controller
{
//GET: Home
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult EnviarArquivos(IEnumerable<HttpPostedFileBase> files)
{
//verifica os arquivos enviados
foreach (var file in files)
{
//atribui um novo nome.
string filePath = Guid.NewGuid() + Path.GetExtension(file.FileName);
//salva dentro da mesma pasta dentro do projeto
file.SaveAs(Path.Combine(Server.MapPath("~/UploadedFiles"), filePath));
}
//retorna a mensagem via JSon
return Json("arquivo enviado com sucesso.");
}
}
}
Cada linha do código possui um comentário para melhor ajudá-lo(a). Lembro que existe apenas esse controller no projeto e no final vou colocar ele no https://www.github.com/mauricio-junior.
Depois da controller, vamos trabalhar com o HTML e CSS. Lembro que vou deixar tudo no mesmo arquivo para melhor entender, mas o ideal seria separar em arquivos .css.
O primeiro passo foi gerar uma área <div>
chamada AreaDeUpload. Existe também um stilo chamado #AreaDeUpload com algumas configurações. Veja o código 1.2.
Código 1.2 - Div e CSS
<h2>Arraste e jogue o arquivo</h2>
<div id="AreaDeUpload">
Arraste seus arquivos nesta área.
</div>
<style>
#AreaDeUpload {
background: #f1f1f1;
border: black dashed 1px;
height: 200px;
text-align: center;
color: #000;
padding-top: 12px;
text-align: center;
vertical-align: central;
}
</style>
O próximo foi importar o arquivo JQuery chamado FileDrop.js. Esse arquivo que vai fazer a mágina disponível na plataforma JQuery. Coloquei no projeto dentro da pasta Scripts caso você queira verificar mais detalhes.
Código 1.3 - Arquivo FileDrop.js
<script src="~/Scripts/jquery.filedrop.js"></script>
A próxima linha será a definição dos drags:
- DragOver
- DragLeave
- Drop
- AfterAll
- UploadFinished
Define quando o usuário arrasta, quando sai, quando solta, depois de tudo e como acaba de fazer o upload para o servidor. No final do arquivo cshtml eu coloquei o código 1.4.
Código 1.4 - JavaScript
@section Scripts{
<script src="~/Scripts/jquery.filedrop.js"></script>
<script type="text/javascript">
$(function () {
$('#AreaDeUpload').filedrop({
url: '@Url.Action("EnviarArquivos")',
allowedfiletypes: [],
allowedfileextensions: [],
paramname: 'files',
maxfiles: 5,
maxfilesize: 5, // in MB
dragOver: function () {
$('#AreaDeUpload').addClass('ArtivarDrop');
},
dragLeave: function () {
$('#AreaDeUpload').removeClass('ArtivarDrop');
},
drop: function () {
$('#AreaDeUpload').removeClass('ArtivarDrop');
},
afterAll: function (e) {
$('#AreaDeUpload').html('arquivos enviados com sucesso.');
},
uploadFinished: function (i, file, response, time) {
$('#uploadList').append('<li class="list-group-item">'+file.name+' enviado com sucesso.</li>')
}
})
})
</script>
}
O código 1.4 mostra que os itens que o filedrop vai pegar o arquivo e jogar para a controller. Mostra o que irá acontecer com a classe quando soltar e tudo mais. Note que o script adiciona e remove classes do CSS dependendo de cada ação.
Vamos adicionar estas classes primeiro no <style>
antes de qualquer coisa. Veja o código 1.5.
Código 1.5 - Adicionando todos os Styles
<style>
#AreaDeUpload {
background: #f1f1f1;
border: black dashed 1px;
height: 200px;
text-align: center;
color: #000;
padding-top: 12px;
text-align: center;
vertical-align: central;
}
.ArtivarDrop {
background: #77bafa !important;
border: solid 2px blue !important;
opacity: .5;
color: black !important;
}
.rodape {
text-align: center;
border: solid 0px Gray;
font-size: 8pt;
font-family: Verdana;
font-weight: bold;
width: 100%;
color: Black;
position: fixed;
bottom: 0px;
left: 0px;
background: #77bafa;
}
</style>
Note que tem a classe rodape
para manter sempre o item no final da página. E de acordo com as ações, o script vai mudando as tags para informar ao usuário na tela. Partindo disso, basta agora adicionar a div
e a ul
principal chamada uploadList, ela que vai aparecer para o usuário indicando o local para arrastar e jogar o arquivo. Coloquei alguns <br/>
no final para a página ter muita área. Veja o código 1.6.
Código 1.6 - Mostrando a tela para o usuário.
<h2>Arraste e jogue o arquivo</h2>
<div id="AreaDeUpload">
Arraste seus arquivos nesta área.
</div>
<ul class="list-group rodape" id="uploadList"></ul>
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
Pronto, a tela está disposta ao usuário para download, com todo o código. Lembra-se que o código 1.4 mostra que a URL chamada é o mesmo nome do método MVC.
@Url.Action("EnviarArquivos")
Veja a figura 2 mostrando o resultado final.
Figura 2 - Fazendo o upload e mostrando o arquivo para o usuário
O código do site completo está dentro do meu https://www.github.com/mauricio-junior. Espero ter ajudado e qualquer dúvida por entrar em contato pelo site https://www.mauriciojunior.org.