예제 #1
0
        public async Task <IActionResult> DeleteFile(Guid id, string filename)
        {
            var entity = await Database.FindAsync <TData>(id);

            if (entity == null)
            {
                return(NotFound(id));
            }

            if (!await Permissions.AllowWrite(await CurrentUser, entity))
            {
                return(Forbid());
            }

            var container = BlobContainerProvider.GetContainerReference(GetContainerId(entity));

            if (!await container.ExistsAsync())
            {
                return(NotFound());
            }

            var dir     = container.GetDirectoryReference("files");
            var blobRef = dir.GetBlockBlobReference(filename);

            await blobRef.DeleteIfExistsAsync();

            return(NoContent());
        }
예제 #2
0
        public async Task <IActionResult> UploadFile(Guid id, IFormFile file)
        {
            var entity = await Database.FindAsync <TData>(id);

            if (entity == null)
            {
                return(NotFound(id));
            }

            if (!await Permissions.AllowWrite(await CurrentUser, entity))
            {
                return(Forbid());
            }

            if (file.Length <= 0)
            {
                return(BadRequest("File Length <= 0"));
            }

            var maxSizeInMegs  = Configuration.GetValue("FileUploads:MaxSizeInMegabytes", 100.0);
            var maxSizeInBytes = (int)(maxSizeInMegs * 1_000_000);

            if (file.Length >= maxSizeInBytes)
            {
                return(BadRequest($"File too large. Max size is {maxSizeInBytes} bytes"));
            }

            var safeFileName = file.FileName.SafeFileName();

            var allowedExtensions = Configuration.GetSection("FileUploads:AllowedExtensions").Get <string[]>().Select(x => x.ToUpper()).ToList();

            if (!allowedExtensions.Contains(Path.GetExtension(safeFileName).ToUpper()))
            {
                return(BadRequest($"File Extension must be one of: {string.Join(", ", allowedExtensions)}"));
            }

            var container = BlobContainerProvider.GetContainerReference(GetContainerId(entity));
            await container.CreateIfNotExistsAsync();

            var dir     = container.GetDirectoryReference("files");
            var blobRef = dir.GetBlockBlobReference(safeFileName);

            await blobRef.UploadFromStreamAsync(file.OpenReadStream());

            blobRef.Metadata["MIME"]  = file.ContentType;
            blobRef.Metadata["Owner"] = (await CurrentUser).Id.ToString();
            await blobRef.SetMetadataAsync();

            await Database.SaveChangesAsync();

            return(CreatedAtAction("GetFile", new { id, filename = safeFileName }, null));
        }
예제 #3
0
        public async Task <IActionResult> ClearOrgAvatar(Guid id)
        {
            var org = await Database.Organizations.FindAsync(id);

            if (org == null)
            {
                return(NotFound());
            }

            if (!await Permissions.AllowWrite(await CurrentUser, org))
            {
                return(Forbid());
            }

            return(await _avatar.ClearAvatar(org));
        }
예제 #4
0
        public async Task <IActionResult> SetOrgAvatar(Guid id, IFormFile upload)
        {
            var org = await Database.Organizations.FindAsync(id);

            if (org == null)
            {
                return(NotFound());
            }

            if (!await Permissions.AllowWrite(await CurrentUser, org))
            {
                return(Forbid());
            }

            return(await _avatar.SetAvatarResult(org, upload));
        }