소스 검색

File uploading

master
부모
커밋
6feddb273f
3개의 변경된 파일100개의 추가작업 그리고 18개의 파일을 삭제
  1. 61
    2
      SecureSharing/Controllers/HomeController.cs
  2. 1
    1
      SecureSharing/Models/MessageModel.cs
  3. 38
    15
      SecureSharing/Views/Home/Index.cshtml

+ 61
- 2
SecureSharing/Controllers/HomeController.cs 파일 보기

using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles; using Microsoft.AspNetCore.StaticFiles;
using Org.BouncyCastle.Ocsp;
using SecureSharing.Business.Dtos; using SecureSharing.Business.Dtos;
using SecureSharing.Business.Interfaces; using SecureSharing.Business.Interfaces;
using SecureSharing.Data.Data; using SecureSharing.Data.Data;
private readonly IModelFactory _modelFactory; private readonly IModelFactory _modelFactory;
private readonly IWebHostEnvironment _webHostEnvironment; private readonly IWebHostEnvironment _webHostEnvironment;
private const string DefaultPath = "files"; private const string DefaultPath = "files";
private const string DefaultPathTmp = "filestmp";
public HomeController(ILogger<HomeController> logger, IMessageService messageService, IModelFactory modelFactory, IWebHostEnvironment webHostEnvironment) public HomeController(ILogger<HomeController> logger, IMessageService messageService, IModelFactory modelFactory, IWebHostEnvironment webHostEnvironment)
{ {
return View(); 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] [HttpPost]
public async Task<IActionResult> CreateMessage(MessageModel model) 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("/"); return Redirect("/");
} }
var message = new MessageDto { Text = model.Text }; var message = new MessageDto { Text = model.Text };
var basePath = Path.Combine(_webHostEnvironment.WebRootPath.Split('/')[0], DefaultPath, message.Code.ToString()); var basePath = Path.Combine(_webHostEnvironment.WebRootPath.Split('/')[0], DefaultPath, message.Code.ToString());
var basePathTemporary = Path.Combine(_webHostEnvironment.WebRootPath.Split('/')[0], DefaultPathTmp);
Directory.CreateDirectory(basePath); 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) foreach (var formFile in model.Files)
{ {
if (formFile.Length <= 0) if (formFile.Length <= 0)
await formFile.CopyToAsync(stream); await formFile.CopyToAsync(stream);
message.FileNames.Add(new FileModel { Name = formFile.FileName }); message.FileNames.Add(new FileModel { Name = formFile.FileName });
} }
var code = await _messageService.Create(message, model.ChosenPeriod); var code = await _messageService.Create(message, model.ChosenPeriod);
return RedirectToAction("Link", "Home", new { code = code, share = true }); return RedirectToAction("Link", "Home", new { code = code, share = true });
} }

+ 1
- 1
SecureSharing/Models/MessageModel.cs 파일 보기

public PeriodOfValidity ChosenPeriod { get; set; } public PeriodOfValidity ChosenPeriod { get; set; }
public List<IFormFile> Files { get; init; } = new(); public List<IFormFile> Files { get; init; } = new();
public List<string> FileNames { get; init; } = new(); public List<string> FileNames { get; init; } = new();
public string FilesAsText { get; set; } = default!;
// public Dictionary<int, string> AvailablePeriods { get; set; } // public Dictionary<int, string> AvailablePeriods { get; set; }
} }

+ 38
- 15
SecureSharing/Views/Home/Index.cshtml 파일 보기

Layout = "~/Views/Shared/_Layout.cshtml"; Layout = "~/Views/Shared/_Layout.cshtml";
} }
@using SecureSharing.Business.Infrastructure @using SecureSharing.Business.Infrastructure
@using System.Text.Json
@model MessageModel @model MessageModel



<h1>Share files</h1> <h1>Share files</h1>
<form method="post" enctype="multipart/form-data" asp-controller="Home" asp-action="CreateMessage" class="share-files-form"> <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> <label class="label-text">Sharing link avaliability</label>
<span style="color:#0D1C52">Drag and drop files here or</span> browse <span style="color:#0D1C52">Drag and drop files here or</span> browse
</label> </label>
<input asp-for="Files" id="fileInput" type="file" multiple style="display: none"/> <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>
</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> <button class=" btn btn-light share-button" type="submit">Share</button>
</form> </form>


function OnDrop(e) { function OnDrop(e) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); 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 //TODO: add Your files: with file uploading in it
// $("#dropContainer").text(selectedFiles.length + " file(s) selected for uploading!"); // $("#dropContainer").text(selectedFiles.length + " file(s) selected for uploading!");
} }

Loading…
취소
저장