Cross-platform file name handling in .NET Core
Windows using Backslash. Linux using Slash. Path.Combine set the right symbol :
Path.Combine Method - MSDN
Reliable image handling on Azure platform / Dotnet core
Technically you do not need any of those other imaging (unless you are doing more that just zipping the content). Convert the base64 to byte array and pass that to the zip file. No need to save to disk just to read it back again for zipping.
//...
if(!string.IsNullOrEmpty(del.Headshot)) {
var imageBytes = Convert.FromBase64String(del.Headshot);
string name = $"{del.FirstName} {del.LastName} - {del.Company}".Trim(Path.GetInvalidFileNameChars()) + "_Headshot.jpg";
ZipArchiveEntry entry = zip.CreateEntry(name);
using(Stream entryStream = entry.Open()) {
entryStream.Write(imageBytes, 0, imageBytes.Length));
}
}
//...
Also using a minor hack for known image types when converted to base64
public static class ImagesUtility {
static IDictionary<string, string> mimeMap =
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
{ "IVBOR", "png" },
{ "/9J/4", "jpg" },
//...add others
};
/// <summary>
/// Extract image file extension from base64 string.
/// </summary>
/// <param name="base64String">base64 string.</param>
/// <returns>file extension from string.</returns>
public static string GetFileExtension(string base64String) {
var data = base64String.Substring(0, 5);
var extension = mimeMap[data.ToUpper()];
return extension;
}
}
You could try to determine the file extension from its prefix
if(!string.IsNullOrEmpty(del.Headshot)) {
var imageBytes = Convert.FromBase64String(del.Headshot);
var ext = ImagesUtility.GetFileExtension(del.Headshot) ?? "jpg";
string name = $"{del.FirstName} {del.LastName} - {del.Company}".Trim(Path.GetInvalidFileNameChars()) + $"_Headshot.{ext}";
ZipArchiveEntry entry = zip.CreateEntry(name);
using(Stream entryStream = entry.Open()) {
entryStream.Write(imageBytes, 0, imageBytes.Length));
}
}
Now ideally, if you are able to control the type of image uploaded, then you should also validate and do what ever image processing when the data is being saved along with any needed metadata (ie content type). That way when extracting it from storage, you can be confident that it is the correct type and size. That saves you having to worry about that later on.
Determine via C# whether a string is a valid file path
A 100% accurate checking of a path's string format is quite difficult, since it will depend on the filesystem on which it is used (and network protocols if its not on the same computer).
Even within windows or even NTFS its not simple since it still depends on the API .NET is using in the background to communicate with the kernel.
And since most filesystems today support unicode, one might also need to check for all the rules for correcly encoded unicode, normalization, etc etc.
What I'd do is to make some basic checks only, and then handle exceptions properly once the path is used. For possible rules see:
- Wikipedia - Filename for an overview of the rules used by different file systems
- Naming Files, Paths, and Namespaces for windows specific rules
Related Topics
A Way to Prevent Bash from Parsing Command Line W/Out Using Escape Symbols
How to Find Files with Same Size
/Var/Log/Daemon.Log Taking More Space How to Reduce It
How to Delete Files Over (N) Days Old But Leave (N) Files Regardless of Age
How to Escape Unusual/Uniq Characters from Expect Scripts
Execute Sudo Using Expect Inside Ssh from Bash
Segmentation Fault with a Variable in Section .Data
Shell Command to Get Directory with Least Access Date/Time
How to Get Docker Commands to Run in the Background with Nohup
How to Mail Script Output in Table Format
How to Change the Permissions in Openshift Container Platform
How to Suspend and Resume a Sequence of Commands in Bash
"Echo" Output Different Answer by Sh and Bash
Python3 Unicodeencodeerror When Run via Synology Task Scheduler
Perf Tool Stat Output: Multiplex and Scaling of "Cycles"