Quellcode durchsuchen

File uploading

master
radivoje.milutinovic vor 3 Jahren
Ursprung
Commit
6feddb273f

+ 61
- 2
SecureSharing/Controllers/HomeController.cs Datei anzeigen

@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles;
using Org.BouncyCastle.Ocsp;
using SecureSharing.Business.Dtos;
using SecureSharing.Business.Interfaces;
using SecureSharing.Data.Data;
@@ -17,6 +18,7 @@ public sealed class HomeController : Controller
private readonly IModelFactory _modelFactory;
private readonly IWebHostEnvironment _webHostEnvironment;
private const string DefaultPath = "files";
private const string DefaultPathTmp = "filestmp";
public HomeController(ILogger<HomeController> logger, IMessageService messageService, IModelFactory modelFactory, IWebHostEnvironment webHostEnvironment)
{
@@ -31,11 +33,30 @@ public sealed class HomeController : Controller
return View();
}

public async Task<string> UploadTemporaryFile()
{
var code = Guid.NewGuid().ToString();
var files = Request.Form.Files.ToList();
var basePath = Path.Combine(_webHostEnvironment.WebRootPath.Split('/')[0], DefaultPathTmp, code);
Directory.CreateDirectory(basePath);
foreach (var formFile in files)
{
if (formFile.Length <= 0)
continue;
var filePath = Path.Combine(basePath, formFile.FileName);
await using var stream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite);
await formFile.CopyToAsync(stream);
}

return code;
}

[HttpPost]
public async Task<IActionResult> CreateMessage(MessageModel model)
{
if (string.IsNullOrWhiteSpace(model.Text) && model.Files.Count == 0)
if (string.IsNullOrWhiteSpace(model.Text) && model.Files.Count == 0 && string.IsNullOrEmpty(model.FilesAsText))
{
return Redirect("/");
}
@@ -43,8 +64,46 @@ public sealed class HomeController : Controller
var message = new MessageDto { Text = model.Text };
var basePath = Path.Combine(_webHostEnvironment.WebRootPath.Split('/')[0], DefaultPath, message.Code.ToString());
var basePathTemporary = Path.Combine(_webHostEnvironment.WebRootPath.Split('/')[0], DefaultPathTmp);
Directory.CreateDirectory(basePath);
var directoryNames = model.FilesAsText
.Split(';')
.Select(x => x.Split(':')[0])
.Where(x => !string.IsNullOrEmpty(x))
.Distinct()
.ToList();

var fileNamesTmp = model.FilesAsText
.Split(';')
.Where(x => !string.IsNullOrEmpty(x))
.ToList();
var fileNames = fileNamesTmp.Select(x => x.Split(':')[1]).ToList();

foreach (var file in fileNames)
{
message.FileNames.Add(new FileModel {Name = file});
}
foreach (var directoryName in directoryNames)
{
var directoryPath = Path.Combine(basePathTemporary, directoryName);
var files = Directory.GetFiles(directoryPath);
for (var i = 0; i < files.Length; i++)
{
// var file = files[i];
var file = fileNames[i];
var filePath = Path.Combine(directoryPath, file);
var newFilePath = Path.Combine(basePath, file);
System.IO.File.Move(filePath, newFilePath);
}
}
foreach (var directory in directoryNames)
{
Directory.Delete(Path.Combine(basePathTemporary, directory), true);
}

foreach (var formFile in model.Files)
{
if (formFile.Length <= 0)
@@ -55,7 +114,7 @@ public sealed class HomeController : Controller
await formFile.CopyToAsync(stream);
message.FileNames.Add(new FileModel { Name = formFile.FileName });
}
var code = await _messageService.Create(message, model.ChosenPeriod);
return RedirectToAction("Link", "Home", new { code = code, share = true });
}

+ 1
- 1
SecureSharing/Models/MessageModel.cs Datei anzeigen

@@ -10,6 +10,6 @@ public sealed class MessageModel
public PeriodOfValidity ChosenPeriod { get; set; }
public List<IFormFile> Files { get; init; } = new();
public List<string> FileNames { get; init; } = new();
public string FilesAsText { get; set; } = default!;
// public Dictionary<int, string> AvailablePeriods { get; set; }
}

+ 38
- 15
SecureSharing/Views/Home/Index.cshtml Datei anzeigen

@@ -2,10 +2,8 @@
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using SecureSharing.Business.Infrastructure
@using System.Text.Json
@model MessageModel


<h1>Share files</h1>
<form method="post" enctype="multipart/form-data" asp-controller="Home" asp-action="CreateMessage" class="share-files-form">
<label class="label-text">Sharing link avaliability</label>
@@ -34,20 +32,17 @@
<span style="color:#0D1C52">Drag and drop files here or</span> browse
</label>
<input asp-for="Files" id="fileInput" type="file" multiple style="display: none"/>
<input asp-for="FilesAsText" id="fileInputAsText" type="text" style="display:none"/>
</div>
</div>
@{
if (Model is not null && Model.Files.Count > 0)
{
<div class="files hidden">
<div class="label-text">Your files: </div>
@foreach (var file in Model.Files)
{
<div class="label-text">@file.Name</div>
}
</div>
}
}
<div class="label-text">
Your files
</div>
<div id="filesUploaded">
</div>
<button class=" btn btn-light share-button" type="submit">Share</button>
</form>

@@ -76,7 +71,35 @@ function OnDragOver(e) {
function OnDrop(e) {
e.stopPropagation();
e.preventDefault();
selectedFiles = e.dataTransfer.files;
var selectedFiles = e.dataTransfer.files;
var formData = new FormData();
var fileInput = document.getElementById("fileInputAsText");
for (var i = 0; i < selectedFiles.length; i++){
formData.append(selectedFiles[i].name, selectedFiles[i]);
}
$.ajax({
url: '/Home/UploadTemporaryFile',
type: "POST",
contentType: false,
processData: false,
data: formData,
success: function (result) {
for (var i = 0; i < selectedFiles.length; i++){
fileInput.value += result + ':' + selectedFiles[i].name + ';';
}
console.log(fileInput.value)
},
error: function (err) {
console.log(err)
}
});
// var xhr = new XMLHttpRequest();
// xhr.open('POST', '/Home/UploadTemporaryFile');
// xhr.send({formData, code});
//TODO: add Your files: with file uploading in it
// $("#dropContainer").text(selectedFiles.length + " file(s) selected for uploading!");
}

Laden…
Abbrechen
Speichern