Refactor HTML (#227)

* Refactor HTML

* Refactor HTML

* Refactor HTML

* Refactor HTML

* Refactor HTML
pull/229/head
Rick Anderson 2023-10-16 13:46:52 -10:00 committed by GitHub
parent 0d601d8292
commit 4142b87404
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 39 deletions

View File

@ -1,3 +1,4 @@
// <snippet_1>
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
@ -8,28 +9,68 @@ builder.Services.AddAntiforgery();
var app = builder.Build();
app.UseAntiforgery();
string GetOrCreateFilePath(string fileName, string filesDirectory = "uploadFiles")
{
var directoryPath = Path.Combine(app.Environment.ContentRootPath, filesDirectory);
Directory.CreateDirectory(directoryPath);
return Path.Combine(directoryPath, fileName);
}
async Task UploadFileWithName(IFormFile file, string fileSaveName)
{
var filePath = GetOrCreateFilePath(fileSaveName);
await using var fileStream = new FileStream(filePath, FileMode.Create);
await file.CopyToAsync(fileStream);
}
var MyHtml = new MyUtils();
// Generate a form with an anti-forgery token and an /upload endpoint.
app.MapGet("/", (HttpContext context, IAntiforgery antiforgery) =>
{
var token = antiforgery.GetAndStoreTokens(context);
var html = $"""
var html = MyHtml.GenerateHtmlForm(token.FormFieldName, token.RequestToken!);
return Results.Content(html, "text/html");
});
app.MapPost("/upload", async Task<Results<Ok<string>,BadRequest<string>>>
([FromForm] FileUpload file, HttpContext context, IAntiforgery antiforgery) =>
{
try
{
await antiforgery.ValidateRequestAsync(context);
await MyHtml.UploadFileWithName(file.FileDocument!, file.Name!,
app.Environment.ContentRootPath);
return TypedResults.Ok($"Your file with the description:" +
$" {file.Description} has been uploaded successfully");
}
catch (AntiforgeryValidationException e)
{
return TypedResults.BadRequest("Invalid anti-forgery token" + e.HResult);
}
});
app.Run();
// </snippet_1>
public class FileUpload
{
public string? Name { get; set; }
public string? Description { get; set; }
public IFormFile? FileDocument { get; set; }
}
public class MyUtils
{
string GetOrCreateFilePath(string fileName, string contentRootPath,
string filesDirectory = "uploadFiles")
{
var directoryPath = Path.Combine(contentRootPath, filesDirectory);
Directory.CreateDirectory(directoryPath);
return Path.Combine(directoryPath, fileName);
}
public async Task UploadFileWithName(IFormFile file, string fileSaveName, string contentRootPath)
{
var filePath = GetOrCreateFilePath(fileSaveName, contentRootPath);
await using var fileStream = new FileStream(filePath, FileMode.Create);
await file.CopyToAsync(fileStream);
}
public string GenerateHtmlForm(string formFieldName, string requestToken)
{
return $"""
<html>
<body>
<form action="/upload" method="POST" enctype="multipart/form-data">
<input name="{token.FormFieldName}" type="hidden" value="{token.RequestToken}" required/>
<input name="{formFieldName}" type="hidden" value="{requestToken}" required/>
<br/>
<input name="Name" type="text" placeholder="Name of file" pattern=".*\.(jpg|jpeg|png)$" title="Please enter a valid name ending with .jpg, .jpeg, or .png" required/>
<br/>
@ -42,30 +83,5 @@ app.MapGet("/", (HttpContext context, IAntiforgery antiforgery) =>
</body>
</html>
""";
return Results.Content(html, "text/html");
});
app.MapPost("/upload", async Task<Results<Ok<string>,
BadRequest<string>>> ([FromForm] FileUpload file, HttpContext context, IAntiforgery antiforgery) =>
{
try
{
await antiforgery.ValidateRequestAsync(context);
await UploadFileWithName(file.FileDocument, file.Name);
return TypedResults.Ok($"Your file with the description: {file.Description} has been uploaded successfully");
}
catch (AntiforgeryValidationException e)
{
return TypedResults.BadRequest("Invalid anti-forgery token");
}
});
app.Run();
public class FileUpload
{
public string? Name { get; set; }
public string? Description { get; set; }
public IFormFile? FileDocument { get; set; }
}

View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}