committed by
GitHub
11 changed files with 19 additions and 250 deletions
@ -1,10 +0,0 @@ |
|||||
using System.Threading; |
|
||||
using System.Threading.Tasks; |
|
||||
|
|
||||
namespace Microsoft.eShopWeb.ApplicationCore.Interfaces |
|
||||
{ |
|
||||
public interface IFileSystem |
|
||||
{ |
|
||||
Task<bool> SavePicture(string pictureName, string pictureBase64, CancellationToken cancellationToken); |
|
||||
} |
|
||||
} |
|
||||
@ -1,84 +0,0 @@ |
|||||
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
|
||||
using Microsoft.eShopWeb.Infrastructure.Data; |
|
||||
using System; |
|
||||
using System.IO; |
|
||||
using System.Net.Http; |
|
||||
using System.Text; |
|
||||
using System.Text.Json; |
|
||||
using System.Threading; |
|
||||
using System.Threading.Tasks; |
|
||||
|
|
||||
namespace Microsoft.eShopWeb.Infrastructure.Services |
|
||||
{ |
|
||||
public class WebFileSystem : IFileSystem |
|
||||
{ |
|
||||
private readonly HttpClient _httpClient; |
|
||||
private readonly string _url; |
|
||||
public const string AUTH_KEY = "AuthKeyOfDoomThatMustBeAMinimumNumberOfBytes"; |
|
||||
|
|
||||
public WebFileSystem(string url) |
|
||||
{ |
|
||||
_url = url; |
|
||||
_httpClient = new HttpClient(); |
|
||||
_httpClient.DefaultRequestHeaders.Add("auth-key", AUTH_KEY); |
|
||||
} |
|
||||
|
|
||||
public async Task<bool> SavePicture(string pictureName, string pictureBase64, CancellationToken cancellationToken) |
|
||||
{ |
|
||||
if (string.IsNullOrEmpty(pictureBase64) || !await UploadFile(pictureName, Convert.FromBase64String(pictureBase64), cancellationToken)) |
|
||||
{ |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
return true; |
|
||||
} |
|
||||
|
|
||||
private async Task<bool> UploadFile(string fileName, byte[] fileData, CancellationToken cancellationToken) |
|
||||
{ |
|
||||
if (!fileData.IsValidImage(fileName)) |
|
||||
{ |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
return await UploadToWeb(fileName, fileData, cancellationToken); |
|
||||
} |
|
||||
|
|
||||
private async Task<bool> UploadToWeb(string fileName, byte[] fileData, CancellationToken cancellationToken) |
|
||||
{ |
|
||||
var request = new FileItem |
|
||||
{ |
|
||||
DataBase64 = Convert.ToBase64String(fileData), |
|
||||
FileName = fileName |
|
||||
}; |
|
||||
var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); |
|
||||
|
|
||||
using var message = await _httpClient.PostAsync(_url, content, cancellationToken); |
|
||||
if (!message.IsSuccessStatusCode) |
|
||||
{ |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
return true; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
public static class ImageValidators |
|
||||
{ |
|
||||
private const int ImageMaximumBytes = 512000; |
|
||||
|
|
||||
public static bool IsValidImage(this byte[] postedFile, string fileName) |
|
||||
{ |
|
||||
return postedFile != null && postedFile.Length > 0 && postedFile.Length <= ImageMaximumBytes && IsExtensionValid(fileName); |
|
||||
} |
|
||||
|
|
||||
private static bool IsExtensionValid(string fileName) |
|
||||
{ |
|
||||
var extension = Path.GetExtension(fileName); |
|
||||
|
|
||||
return string.Equals(extension, ".jpg", StringComparison.OrdinalIgnoreCase) || |
|
||||
string.Equals(extension, ".png", StringComparison.OrdinalIgnoreCase) || |
|
||||
string.Equals(extension, ".gif", StringComparison.OrdinalIgnoreCase) || |
|
||||
string.Equals(extension, ".jpeg", StringComparison.OrdinalIgnoreCase); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,38 +0,0 @@ |
|||||
using Microsoft.AspNetCore.Authorization; |
|
||||
using Microsoft.AspNetCore.Mvc; |
|
||||
using Microsoft.eShopWeb.Web.ViewModels.File; |
|
||||
using System; |
|
||||
using System.IO; |
|
||||
|
|
||||
namespace Microsoft.eShopWeb.Web.Controllers |
|
||||
{ |
|
||||
[Route("[controller]")]
|
|
||||
[ApiController] |
|
||||
public class FileController : ControllerBase |
|
||||
{ |
|
||||
[HttpPost] |
|
||||
[AllowAnonymous] |
|
||||
public IActionResult Upload(FileViewModel fileViewModel) |
|
||||
{ |
|
||||
if (!Request.Headers.ContainsKey("auth-key") || Request.Headers["auth-key"].ToString() != ApplicationCore.Constants.AuthorizationConstants.AUTH_KEY) |
|
||||
{ |
|
||||
return Unauthorized(); |
|
||||
} |
|
||||
|
|
||||
if(fileViewModel == null || string.IsNullOrEmpty(fileViewModel.DataBase64)) return BadRequest(); |
|
||||
|
|
||||
var fileData = Convert.FromBase64String(fileViewModel.DataBase64); |
|
||||
if (fileData.Length <= 0) return BadRequest(); |
|
||||
|
|
||||
var fullPath = Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot/images/products", fileViewModel.FileName); |
|
||||
if (System.IO.File.Exists(fullPath)) |
|
||||
{ |
|
||||
System.IO.File.Delete(fullPath); |
|
||||
} |
|
||||
System.IO.File.WriteAllBytes(fullPath, fileData); |
|
||||
|
|
||||
return Ok(); |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
} |
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
Loading…
Reference in new issue