我正在为我在MVC 4 Web App中上传的图像生成一个随机名称。

我的控制器:

[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult Create(Article article, HttpPostedFileBase file)
{
    if (ModelState.IsValid)
    {
        if (file != null && file.ContentLength > 0)
        {
            // extract only the filename
            var fileName = System.IO.Path.GetFileName(file.FileName);
            // store the file inside ~/App_Data/uploads folder
            var path = System.IO.Path.Combine(Server.MapPath("~/UploadedImages/Articles"), fileName);
            file.SaveAs(path);
            article.ArticleImage = file.FileName;
            ViewBag.Path = String.Format("~/UploadedImages/Events", fileName);
        }
        db.Articles.Add(article);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.SportID = new SelectList(db.Sports, "SportID", "Name", article.SportID);
    return View(article);
}

我尝试使用GetRandomFileName方法,但是没有运气。 不确定这是否是正确的方法。

提前致谢!

===============>>#1 票数:5

最简单的方法可能是使用Guid.NewGuid()作为文件名。 对于大多数用途来说,它是伪随机的,并且足够独特,以至于很少有机会创建之前创建的Guid
您将需要使用Path的GetExtension方法从原始文件名中提取文件扩展名,并且对于前面提到的可能性很小,我建议编写这样的方法:

string GenerateFileName(string TergetPath, HttpPostedFileBase file)
{
    string ReturnValue;
    string extension = Path.GetExtension(file.FileName);
    string FileName = Guid.NewGuid().ToString();
    ReturnValue = FileName + extension;
    if(!File.Exists(Path.Combine(TergetPath, ReturnValue)) 
    {
        return ReturnValue;
    }
    // This part creates a recursive pattern to ensure that you will not overwrite an existing file
    return GenerateFileName(TergetPath, file); 
}

然后,您可以从现有代码中调用它,如下所示:

var DirectoryPath = Server.MapPath("~/UploadedImages/Articles");
var path = GenerateFileName(DirectoryPath, file);

===============>>#2 票数:2 已采纳

您可以使用Guid.NewGuid()生成随机名称,但是这是我在项目中使用的扩展方法:

public static string UploadFile(HttpPostedFileBase file)
        {
            if (file != null)
            {
                var fileName = Path.GetFileName(file.FileName);
                var rondom = Guid.NewGuid() + fileName;
                var path = Path.Combine(HttpContext.Current.Server.MapPath("~/Content/Files/"), rondom);
                if (!Directory.Exists(HttpContext.Current.Server.MapPath("~/Content/Files/")))
                {
                    Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/Content/Files/"));
                }
                file.SaveAs(path);

                return rondom;
            }
            return "nofile.png";
        }

  ask by dk_french032 translate from so

未解决问题?本站智能推荐: