gpt4 book ai didi

c# - 为用户创建头像上传表单

转载 作者:可可西里 更新时间:2023-11-01 08:10:59 26 4
gpt4 key购买 nike

我正在使用 ASP.Net MVC 5,我想为我的用户配置文件创建一个头像。我不确定我目前所做的是否正确,尤其是出于安全原因,所以我想获得一些建议。

目前我在做什么

在 View 中:

@using (Html.BeginForm("ManageUser", "Account", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="file" name="file" />
<input type="submit" value="Add Avatar" />
}

在 Controller 中:

    internal static bool SaveAvatar(User user, HttpPostedFileBase file)
{
if (file == null || file.ContentLength <= 0 || file.ContentLength > MAX_LENGTH)
return false;

//I think I should convert the file somehow instead of saving it
var path = HostingEnvironment.MapPath("~/img/avatar/") + string.Format("{0}.png", user.UserName);
file.SaveAs(path);
user.HasAvatar = true;

return true;
}

我有几个问题:

  • 在上面的代码中,正如我评论的那样,我认为不仅仅是保存用户发送给我的内容,我应该以某种方式使用库来转换将图像转换为 PNG 文件并保存。如果是这样,是否有一个好的和简单的库来执行此操作?
  • 我想知道使用用户名作为文件是否是个好主意。毕竟,这个名字是他们选择的,不是我能决定的。
  • 使用纯图像是个好主意还是我应该创建一个 Controller 来验证请求或将请求发送到隐藏图像?

如果我正在做的事情完全是错误的,而您知道更好的资源来学习正确的方法,请为我​​指出正确的方向。谢谢。

最佳答案

您可以使用此类将文件上传到服务器:

public static class FileUpload
{
public static char DirSeparator = System.IO.Path.DirectorySeparatorChar;
public static string FilesPath = HttpContext.Current.Server.MapPath("~\\Content" + DirSeparator + "Uploads" + DirSeparator);

public static string UploadFile(HttpPostedFileBase file)
{
// Check if we have a file
if (null == file) return "";
// Make sure the file has content
if (!(file.ContentLength > 0)) return "";

string fileName =DateTime.Now.Millisecond+ file.FileName;
string fileExt = Path.GetExtension(file.FileName);

// Make sure we were able to determine a proper extension
if (null == fileExt) return "";

// Check if the directory we are saving to exists
if (!Directory.Exists(FilesPath))
{
// If it doesn't exist, create the directory
Directory.CreateDirectory(FilesPath);
}

// Set our full path for saving
string path = FilesPath + DirSeparator + fileName;

// Save our file
file.SaveAs(Path.GetFullPath(path));

// Save our thumbnail as well
ResizeImage(file, 70, 70);

// Return the filename
return fileName;
}

public static void DeleteFile(string fileName)
{
// Don't do anything if there is no name
if (fileName.Length == 0) return;

// Set our full path for deleting
string path = FilesPath + DirSeparator + fileName;
string thumbPath = FilesPath + DirSeparator + "Thumbnails" + DirSeparator + fileName;

RemoveFile(path);
RemoveFile(thumbPath);
}

private static void RemoveFile(string path)
{
// Check if our file exists
if (File.Exists(Path.GetFullPath(path)))
{
// Delete our file
File.Delete(Path.GetFullPath(path));
}
}

public static void ResizeImage(HttpPostedFileBase file, int width, int height)
{
string thumbnailDirectory = String.Format(@"{0}{1}{2}", FilesPath, DirSeparator, "Thumbnails");

// Check if the directory we are saving to exists
if (!Directory.Exists(thumbnailDirectory))
{
// If it doesn't exist, create the directory
Directory.CreateDirectory(thumbnailDirectory);
}

// Final path we will save our thumbnail
string imagePath = String.Format(@"{0}{1}{2}", thumbnailDirectory, DirSeparator, file.FileName);
// Create a stream to save the file to when we're done resizing
FileStream stream = new FileStream(Path.GetFullPath(imagePath), FileMode.OpenOrCreate);

// Convert our uploaded file to an image
Image OrigImage = Image.FromStream(file.InputStream);
// Create a new bitmap with the size of our thumbnail
Bitmap TempBitmap = new Bitmap(width, height);

// Create a new image that contains are quality information
Graphics NewImage = Graphics.FromImage(TempBitmap);
NewImage.CompositingQuality = CompositingQuality.HighQuality;
NewImage.SmoothingMode = SmoothingMode.HighQuality;
NewImage.InterpolationMode = InterpolationMode.HighQualityBicubic;

// Create a rectangle and draw the image
Rectangle imageRectangle = new Rectangle(0, 0, width, height);
NewImage.DrawImage(OrigImage, imageRectangle);

// Save the final file
TempBitmap.Save(stream, OrigImage.RawFormat);

// Clean up the resources
NewImage.Dispose();
TempBitmap.Dispose();
OrigImage.Dispose();
stream.Close();
stream.Dispose();
}

您还可以使用 ResizeImage 方法保存他们照片的缩略图,在 Controller 中,我将以这种方式将文件名保存在数据库中:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(User user, HttpPostedFileBase file)
{

// TODO: Add insert logic here
user.Pictuer = FileUpload.UploadFile(file);
db.User.Add(user);
db.SaveChanges();
return RedirectToAction("Index");


}

还可以使用 this code 转换上传的图像在 UploadFile 方法中:

    System.Drawing.Image image1 = System.Drawing.Image.FromFile(@"C:\test.bmp");
// Save the image in JPEG format.
image1.Save(@"C:\test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

// Save the image in GIF format.
image1.Save(@"C:\test.gif", System.Drawing.Imaging.ImageFormat.Gif);

// Save the image in PNG format.
image1.Save(@"C:\test.png", System.Drawing.Imaging.ImageFormat.Png);

关于c# - 为用户创建头像上传表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18570173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com