使用asp.net mvc 3将文件上传到文件夹时拒绝访问?

时间:2013-02-26 15:26:40

标签: c# asp.net asp.net-mvc asp.net-mvc-3 file-upload

我目前正在研究asp.net mvc 3,现在我正在尝试实现一个用户可以将文件上传到文件夹的应用程序:

这是我的第一个实现,它实际上工作正常,这是控制器代码:

   public class FileUploadController : Controller
    {
        //
        // GET: /FileUpload/

        public ActionResult Index()
        {
            return View();
        }
        [HttpPost]
        [ActionName("Upload")]
        public ActionResult Index(FormCollection form)
        {

            string upFolder = Server.MapPath("~/FileUploadFiles/");

            if(!Directory.Exists(upFolder))
            {
                Directory.CreateDirectory(upFolder);
            }
            HttpPostedFileBase photo = Request.Files["fileupload"];

            if (photo != null)
            {
                photo.SaveAs(upFolder+photo.FileName);
                return RedirectToAction("Index");
            }



            return View();
        }

    }

这是我的另一个实现,我收到错误“拒绝访问路径'UserUploads \ Uploads \'。”以下是处理上传的utitility类:

 public static class FileUploader
    {
        public static char DirSeparator = Path.DirectorySeparatorChar;
        public static string FilesPath = "UserUploads" + DirSeparator + "Uploads" + DirSeparator;

        public static string UploadFile(HttpPostedFileBase file)
        {
            //check if we have a file
            if(file == null)
            {
                return "";
            }

            //make sure the file has content
            if(!(file.ContentLength > 0 ))
            {
                return "";
            }

            string fileName = file.FileName;
            string fileExt = Path.GetExtension(file.FileName);

            //make sure we are able to determine a proper extension
            if(fileExt == null)
            {
                return "";
            }

            //check if directory does not exists
            if(!Directory.Exists(FilesPath))
            {
                Directory.CreateDirectory(FilesPath);
            }

            //set our full path for saving
            string path = FilesPath + DirSeparator + fileName;
            //Save the file
            file.SaveAs(Path.GetFullPath(path));

            //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;

            //Check if our file exists
            if(File.Exists(Path.GetFullPath(path)))
            {
                File.Delete(Path.GetFullPath(path));
            }
        }

以下是控制器的代码:

using MvcFileUpload.Utility;

namespace MvcFileUpload.Controllers
{
    public class UploadFilesController : Controller
    {
        //
        // GET: /UploadFiles/

        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        [ActionName("Upload")]
        public ActionResult Index(HttpPostedFileBase file)
        {

            FileUploader.UploadFile(file);
            return RedirectToAction("Index");
        }

    }
}

4 个答案:

答案 0 :(得分:3)

应该创建FilePath目录在哪里?在网站根目录下?您应手动创建“UserUploads”文件夹,并为AppPool(包括您的Web应用程序)运行的帐户提供在该处写入的权限。

答案 1 :(得分:2)

路径可能不正确吗?我注意到在可行的实现中,您使用Server.MapPath()为目录使用完整的物理路径,但实用程序类只有部分路径。如果您尝试为FilesPath变量分配完整路径会发生什么?如果您仍然遇到问题,我建议运行ProcMon以获取有关生成访问被拒绝错误时文件系统上发生的情况的更多信息。

答案 2 :(得分:0)

我能够通过

来解决它

修改实用程序类:

 public static string FilesPath = HttpContext.Current.Server.MapPath("~\\UserUploads" + DirSeparator + "Uploads" + DirSeparator);

感谢Sir / Ma'am提供解决方案。谢谢++

答案 3 :(得分:0)

没有一个解决方案帮助了我。我正在考虑将用户分配给具有目录访问权限的IIS。