Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions Dimodi.Telerik.Blazor.Templates.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,17 @@
<PackageProjectUrl>https://github.com/dimodi/project-templates</PackageProjectUrl>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageReleaseNotes>
NEW
* Add support for Telerik UI for Blazor 14.0.0.
FIXED
* Create a new file instead of appending on first chunk upload.
* Use simpler namespace declaration syntax in controllers.
</PackageReleaseNotes>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageTags>Telerik;Blazor;dotnet-new;templates</PackageTags>
<PackageType>Template</PackageType>
<RepositoryUrl>https://github.com/dimodi/project-templates</RepositoryUrl>
<TargetFramework>netstandard2.0</TargetFramework>
<Title>Telerik Blazor Project and Item Templates</Title>
<Version>6.5.7</Version>
<Version>6.5.8</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
197 changes: 104 additions & 93 deletions Items/UploadController/UploadController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,128 +5,139 @@
using System.Text;
#endif

namespace {TVAR_ROOTNAMESPACE}.Controllers
{
[Route("{TVAR_ROUTE}")]
namespace {TVAR_ROOTNAMESPACE}.Controllers;

[Route("{TVAR_ROUTE}")]
#if (ApiController)
[ApiController]
[ApiController]
#endif
public class UploadController : ControllerBase
{
private IWebHostEnvironment HostingEnvironment { get; set; }
public class UploadController : ControllerBase
{
private IWebHostEnvironment HostingEnvironment { get; set; }

private readonly string RootPath;
private readonly string RootPath;

public UploadController(IWebHostEnvironment hostingEnvironment)
public UploadController(IWebHostEnvironment hostingEnvironment)
{
HostingEnvironment = hostingEnvironment;
RootPath = HostingEnvironment.WebRootPath;
}

[HttpPost]
public async Task<IActionResult> Save(IFormFile files)
{
if (files is null)
{
HostingEnvironment = hostingEnvironment;
RootPath = HostingEnvironment.WebRootPath;
Response.StatusCode = 400;
await Response.WriteAsync("No file to upload.");
return new EmptyResult();
}

[HttpPost]
public async Task<IActionResult> Save(IFormFile files)
try
{
if (files != null)
{
try
{
string saveLocation = Path.Combine(RootPath, files.FileName);

using FileStream fs = new(saveLocation, FileMode.Create);
await files.CopyToAsync(fs);

Response.StatusCode = 201;
}
catch (Exception ex)
{
Response.StatusCode = 500;
await Response.WriteAsync($"Upload failed: {ex.Message}");
}
}
string saveLocation = Path.Combine(RootPath, files.FileName);

return new EmptyResult();
using FileStream fs = new(saveLocation, FileMode.Create);
await files.CopyToAsync(fs);

Response.StatusCode = 201;
}
catch (Exception ex)
{
Response.StatusCode = 500;
await Response.WriteAsync($"Upload failed: {ex.Message}");
}

return new EmptyResult();
}

#if (ChunkUpload)
[HttpPost]
public async Task<IActionResult> SaveChunk(IFormFile files, [FromForm] string chunkMetadata)
[HttpPost]
public async Task<IActionResult> SaveChunk(IFormFile files, [FromForm] string chunkMetadata)
{
if (files is null)
{
Response.StatusCode = 400;
await Response.WriteAsync("No file to upload.");
return new EmptyResult();
}

try
{
if (files != null)
DataContractJsonSerializer dcSerializer = new(typeof(ChunkMetadata));
using MemoryStream ms = new(Encoding.UTF8.GetBytes(chunkMetadata));

if (dcSerializer.ReadObject(ms) is not ChunkMetadata metadata)
{
try
{
DataContractJsonSerializer dcSerializer = new(typeof(ChunkMetadata));
MemoryStream ms = new(Encoding.UTF8.GetBytes(chunkMetadata));

if (dcSerializer.ReadObject(ms) is not ChunkMetadata metadata)
{
throw new NullReferenceException("Chunk metadata serialization failed.");
}

string saveLocation = Path.Combine(RootPath, metadata.FileName);

using FileStream fs = new(saveLocation, FileMode.Append);
await files.CopyToAsync(fs);

Response.StatusCode = 201;
}
catch (Exception ex)
{
Response.StatusCode = 500;
await Response.WriteAsync($"Upload failed: {ex.Message}");
}
throw new NullReferenceException("Chunk metadata serialization failed.");
}

return new EmptyResult();
string saveLocation = Path.Combine(RootPath, metadata.FileName);

using FileStream fs = new(saveLocation, metadata.ChunkIndex == 0 ? FileMode.Create : FileMode.Append);
await files.CopyToAsync(fs);

Response.StatusCode = 201;
}
catch (Exception ex)
{
Response.StatusCode = 500;
await Response.WriteAsync($"Upload failed: {ex.Message}");
}

return new EmptyResult();
}

#endif
[HttpPost]
public async Task<IActionResult> Remove([FromForm] string files)
[HttpPost]
public async Task<IActionResult> Remove([FromForm] string files)
{
if (string.IsNullOrEmpty(files?.Trim()))
{
Response.StatusCode = 400;
await Response.WriteAsync("No file to delete.");
return new EmptyResult();
}

try
{
if (files != null)
string fileLocation = Path.Combine(RootPath, files);

if (System.IO.File.Exists(fileLocation))
{
try
{
string fileLocation = Path.Combine(RootPath, files);

if (System.IO.File.Exists(fileLocation))
{
System.IO.File.Delete(fileLocation);
}
}
catch (Exception ex)
{
Response.StatusCode = 500;
await Response.WriteAsync($"Delete failed: {ex.Message}");
}
System.IO.File.Delete(fileLocation);
}

return new EmptyResult();
}
catch (Exception ex)
{
Response.StatusCode = 500;
await Response.WriteAsync($"Delete failed: {ex.Message}");
}

return new EmptyResult();
}
}
#if (ChunkUpload)

[DataContract]
public class ChunkMetadata
{
[DataMember(Name = "fileId")]
public string FileId { get; set; } = string.Empty;
[DataContract]
public class ChunkMetadata
{
[DataMember(Name = "fileId")]
public string FileId { get; set; } = string.Empty;

[DataMember(Name = "fileName")]
public string FileName { get; set; } = string.Empty;
[DataMember(Name = "fileName")]
public string FileName { get; set; } = string.Empty;

[DataMember(Name = "fileSize")]
public long FileSize { get; set; }
[DataMember(Name = "fileSize")]
public long FileSize { get; set; }

[DataMember(Name = "contentType")]
public string ContentType { get; set; } = string.Empty;
[DataMember(Name = "contentType")]
public string ContentType { get; set; } = string.Empty;

[DataMember(Name = "chunkIndex")]
public long ChunkIndex { get; set; }
[DataMember(Name = "chunkIndex")]
public long ChunkIndex { get; set; }

[DataMember(Name = "totalChunks")]
public long TotalChunks { get; set; }
}
[DataMember(Name = "totalChunks")]
public long TotalChunks { get; set; }
}
#endif
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,22 @@

// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace TelerikBlazorWebApp.Controllers
namespace TelerikBlazorWebApp.Controllers;

[Route("[controller]/[action]")]
public class CultureController : Controller
{
[Route("[controller]/[action]")]
public class CultureController : Controller
public IActionResult Set(string culture, string redirectUri)
{
public IActionResult Set(string culture, string redirectUri)
if (culture != null)
{
if (culture != null)
{
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture, culture)),
new CookieOptions() { Expires = new DateTimeOffset(DateTime.Now.AddDays(30)) }
);
}

return LocalRedirect(redirectUri);
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture, culture)),
new CookieOptions() { Expires = new DateTimeOffset(DateTime.Now.AddDays(30)) }
);
}

return LocalRedirect(redirectUri);
}
}
Loading
Loading