yavsc/Yavsc/Helpers/FileSystemHelpers.cs

203 lines
7.1 KiB
C#

8 years ago
8 years ago
using System;
8 years ago
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
8 years ago
using System.Linq;
8 years ago
using System.Net.Mime;
8 years ago
using System.Security.Claims;
using System.Web;
8 years ago
using Microsoft.AspNet.Http;
using Yavsc.Exceptions;
8 years ago
using Yavsc.Models;
using Yavsc.Models.FileSystem;
using Yavsc.ViewModels;
8 years ago
using Yavsc.ViewModels.UserFiles;
namespace Yavsc.Helpers
{
8 years ago
public static class FileSystemHelpers
{
public static UserDirectoryInfo GetUserFiles(this ClaimsPrincipal user, string subdir)
{
UserDirectoryInfo di = new UserDirectoryInfo(user.Identity.Name, subdir);
8 years ago
return di;
}
8 years ago
public static bool IsValidDirectoryName(this string name)
8 years ago
{
return !name.Any(c => !Constants.ValidChars.Contains(c));
8 years ago
}
public static bool IsValidPath(this string path)
8 years ago
{
if (path == null) return true;
8 years ago
foreach (var name in path.Split(Path.DirectorySeparatorChar))
8 years ago
{
if (name != null)
8 years ago
if (!IsValidDirectoryName(name)
8 years ago
|| name.Equals(".."))
return false;
}
8 years ago
return true;
}
8 years ago
public static string InitPostToFileSystem(
this ClaimsPrincipal user,
string subpath)
{
var root = Path.Combine(Startup.UserFilesDirName, user.Identity.Name);
var diRoot = new DirectoryInfo(root);
if (!diRoot.Exists) diRoot.Create();
if (subpath != null)
if (subpath.IsValidPath())
{
root = Path.Combine(root, subpath);
diRoot = new DirectoryInfo(root);
if (!diRoot.Exists) diRoot.Create();
}
else throw new InvalidPathException();
8 years ago
return root;
}
8 years ago
public static FileRecievedInfo ReceiveUserFile(this ApplicationUser user, string root, IFormFile f)
8 years ago
{
8 years ago
long usage = user.DiskUsage;
8 years ago
var item = new FileRecievedInfo();
// form-data; name="file"; filename="capt0008.jpg"
ContentDisposition contentDisposition = new ContentDisposition(f.ContentDisposition);
item.FileName = contentDisposition.FileName;
var fi = new FileInfo(Path.Combine(root, item.FileName));
if (fi.Exists) item.Overriden = true;
using (var dest = fi.OpenWrite())
{
using (var org = f.OpenReadStream())
{
byte[] buffer = new byte[1024];
long len = org.Length;
if (len > (user.DiskQuota - usage)) {
return item;
}
8 years ago
usage += len;
8 years ago
while (len > 0)
{
int blen = len > 1024 ? 1024 : (int)len;
org.Read(buffer, 0, blen);
dest.Write(buffer, 0, blen);
len -= blen;
}
dest.Close();
org.Close();
item.Success=true;
8 years ago
}
}
8 years ago
user.DiskUsage = usage;
8 years ago
return item;
}
public static HtmlString FileLink(this DefaultFileInfo info, string username, string subpath)
{
return new HtmlString( Startup.UserFilesOptions.RequestPath+"/"+ username + "/" + subpath + "/" +
HttpUtility.UrlEncode(info.Name) );
}
8 years ago
public static FileRecievedInfo ReceiveAvatar(this ApplicationUser user, IFormFile formFile)
{
var item = new FileRecievedInfo();
item.FileName = user.UserName + ".png";
8 years ago
var destFileName = Path.Combine(Startup.SiteSetup.UserFiles.Avatars, item.FileName);
var fi = new FileInfo(destFileName);
if (fi.Exists) item.Overriden = true;
Rectangle cropRect = new Rectangle();
using (var org = formFile.OpenReadStream())
{
Image i = Image.FromStream(org);
using (Bitmap source = new Bitmap(i))
{
if (i.Width != i.Height)
{
if (i.Width > i.Height)
{
cropRect.X = (i.Width - i.Height) / 2;
cropRect.Y = 0;
cropRect.Width = i.Height;
cropRect.Height = i.Height;
}
else
{
cropRect.X = 0;
cropRect.Y = (i.Height - i.Width) / 2;
cropRect.Width = i.Width;
cropRect.Height = i.Width;
}
using (var cropped = source.Clone(cropRect, source.PixelFormat))
{
CreateAvatars(user,cropped);
}
}
}
}
8 years ago
item.DestDir = Startup.AvatarsOptions.RequestPath.ToUriComponent();
user.Avatar = $"{item.DestDir}/{item.FileName}";
item.Success = true;
8 years ago
return item;
}
private static void CreateAvatars(this ApplicationUser user, Bitmap source)
{
var dir = Startup.SiteSetup.UserFiles.Avatars;
var name = user.UserName + ".png";
var smallname = user.UserName + ".s.png";
var xsmallname = user.UserName + ".xs.png";
using (Bitmap newBMP = new Bitmap(source, 128, 128))
{
newBMP.Save(Path.Combine(
dir, name), ImageFormat.Png);
}
using (Bitmap newBMP = new Bitmap(source, 64, 64))
{
newBMP.Save(Path.Combine(
dir, smallname), ImageFormat.Png);
}
using (Bitmap newBMP = new Bitmap(source, 32, 32))
{
newBMP.Save(Path.Combine(
dir, xsmallname), ImageFormat.Png);
}
}
public static Func<string,long,string>
SignFileNameFormat = new Func<string,long,string> ((signType,estimateId) => $"estimate-{signType}sign-{estimateId}.png");
public static FileRecievedInfo ReceiveProSignature(this ClaimsPrincipal user, long estimateId, IFormFile formFile, string signtype)
{
var item = new FileRecievedInfo();
item.FileName = SignFileNameFormat("pro",estimateId);
var destFileName = Path.Combine(Startup.SiteSetup.UserFiles.Bills, item.FileName);
var fi = new FileInfo(destFileName);
if (fi.Exists) item.Overriden = true;
using (var org = formFile.OpenReadStream())
{
Image i = Image.FromStream(org);
using (Bitmap source = new Bitmap(i))
{
source.Save(destFileName, ImageFormat.Png);
}
}
item.Success=true;
return item;
}
8 years ago
}
}