为用户创建头像上传表单
我正在使用ASP.Net MVC 5,我想为我的用户配置文件创建一个头像。 我不确定到目前为止我做的是不是正确的方式,特别是出于安全考虑,所以我想得到一些建议。
到目前为止我在做什么
在视图中:
@using (Html.BeginForm("ManageUser", "Account", FormMethod.Post, new { enctype = "multipart/form-data" })) { }
在控制器中:
internal static bool SaveAvatar(User user, HttpPostedFileBase file) { if (file == null || 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文件并保存。 如果是这样,有没有一个好的和简单的库来做到这一点?
- 我想知道使用用户名作为文件是否是个好主意。 毕竟,他们选择这个名字并不是我决定的。
- 使用普通图像是一个好主意,还是应该创建一个控制器来validation请求或将请求路由到隐藏图像?
如果我正在做的事情完全错了,你知道一个更好的资源来学习正确的方法,请指出我正确的方向。 谢谢。
您可以使用此类将文件上载到服务器:
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
方法保存照片的缩略图,在控制器中我将这样保存在数据库中的文件名:
[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"); }
也可以转换上传的图像,你可以在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);
我发现这篇文章非常有用,我想分享我对Sirwan Afifi的优秀答案的实现。 我需要resize函数来获取并返回一个图像,所以它有点不同。 但是,如果需要,我还添加了一个布尔值来保留图像的宽高比。
public static Image ResizeImage(Image img, int width, int height, bool preserveAspectRatio = false) { int newWidth; int newHeight; if (preserveAspectRatio) { int originalWidth = img.Width; int originalHeight = img.Height; float percentWidth = (float)width / (float)originalWidth; float percentHeight = (float)height / (float)originalHeight; float percent = percentHeight < percentWidth ? percentHeight : percentWidth; //Rounding to get the set width to the exact pixel newWidth = (float)originalWidth * percent < (float)width ? (int)(Math.Ceiling((float)originalWidth * percent)) : (int)((float)originalWidth * percent); //Rounding to get the set height to the exact pixel newHeight = (float)originalHeight * percent < (float)height ? (int)(Math.Ceiling((float)originalHeight * percent)) : (int)((float)originalHeight * percent); } else { newWidth = width; newHeight = height; } // Create a new bitmap with the size Bitmap TempBitmap = new Bitmap(newWidth, newHeight); // 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, newWidth, newHeight); NewImage.DrawImage(img, imageRectangle); return TempBitmap; }
- C#ASP.Net:在长数据库操作期间出现exception(仅限某些时间)
- 为什么只有在我打开Fiddler时才能在ASP.NET中调用API?
- 如何在C#/ ASP中的单例中使用作用域依赖项
- 从.NET调用Java / AXIS Web服务:’return null’问题
- 在列表框中显示项目有哪些可能性?
- 如何在asp.net web应用程序中调用javascript方法
- 如何将EF Code First DbContext绑定到Asp.Net DataSource?
- 活动目录UserPrincipal.Current.GetGroups()返回本地而非Web服务器上的组
- 如何在ASP.NET中使用插件架构?