为什么 map.server 虚拟路径没有保存到数据库中

Why is the map.server virtual path not being saved to the database

我一直坚持保存文件上传到我的数据库的虚拟路径。如果没有虚拟路径,文件将被保存,数据库中的 url 是文件的物理路径。所以当我尝试下载它时,我得到了不允许的本地资源。 url 以 file:///C:path 开头....
当我使用断点时,我看到物理路径正在更改为虚拟路径,但它例外。

api控制器

//POST
    public async Task<HttpResponseMessage> Post()
    {

        try
        {
            //saving the posted file to the harddisk
            string root = HttpContext.Current.Server.MapPath("~/Files/");
            var provider = new MultipartFormDataStreamProvider(root);
            await Request.Content.ReadAsMultipartAsync(provider);

            //Get Logged in User Name
            var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
            var user = manager.FindById(User.Identity.GetUserId());

            //getting the user details and storing in the object
            Document model = new Document();
            model.TypeId = Convert.ToInt32(provider.FormData["TypeId"]);
            model.TypeName = provider.FormData["TypeName"];
            model.PipeName = provider.FormData["PipeName"];
            model.DocumentUrl = provider.FormData["DocumentUrl"];
            model.DocumentUrl = model.DocumentUrl == "" ? null : model.DocumentUrl;

            //if there is a file then save that file to the desired location
            if (provider.FileData.Count > 0)
            {
                MultipartFileData fileData = provider.FileData[0];
                FileInfo fi = new FileInfo(fileData.LocalFileName);
                if (!Directory.Exists(fi.DirectoryName))
                {
                    Directory.CreateDirectory(fi.DirectoryName);
                }
                else
                {
                    //getting the file saving path
                    string clientFileName = fileData.Headers.ContentDisposition.FileName.Replace(@"""", "");
                    if (clientFileName != "")
                    {
                        string clientExtension = clientFileName.Substring(clientFileName.LastIndexOf('.'));
                        string space = ("-");
                        var dt = model.DocumentDate.ToString("y").Replace('/', '-').Replace(':', '-');
                        var CompanyName = model.CompanyName.Replace('_', ' ');

                        string vPath = root.Replace(@"C:\Development\TransparentEnergy\TransparentEnergy", "~").Replace("\", "/");
                        string serverFileName = vPath + CompanyName + space + model.TypeName + space + model.CounterPartyName + space + dt + clientExtension;
                        model.DocumentUrl = serverFileName;



                        FileInfo fiOld = new FileInfo(vPath);
                        if (fiOld.Exists)
                            fiOld.Delete();
                        //if (File.Exists())
                        fi.MoveTo(serverFileName);
                    }
                    else
                    {
                        if (fi.Exists)
                            fi.Delete();
                    }
                }
            }
            //calling DB to save the user details
            using (var context = new ApplicationDbContext())
            {
                //save to db
                context.Documents.Add(model);
                context.SaveChanges();
            }
        }
        catch (Exception fex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, fex);
        }
        //sending the confirmation or error back to the user
        return Request.CreateResponse(HttpStatusCode.OK);
    }

断点在:

model.DocumentUrl = serverFileName;

显示

"~/Files/Black Elk-Invoices-None-May 2006.pdf"

异常发生在这里

 FileInfo fiOld = new FileInfo(vPath);
  if (fiOld.Exists)
  fiOld.Delete();
//if (File.Exists())
  fi.MoveTo(serverFileName);

FiloInfo(vPath) 显示

~/Files/

异常发生在:

fi.MoveTo(serverFileName);

异常消息:

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.__Error.WinIOError() at System.IO.FileInfo.MoveTo(String destFileName) at TransparentEnergy.ControllersAPI.apiInvoiceController.d__0.MoveNext() in c:\Development\TransparentEnergy\TransparentEnergy\ControllersAPI\SubmitApi\apiInvoiceController.cs:line 87

已更新

 //POST
    public async Task<HttpResponseMessage> Post()
    {

        try
        {
            //saving the posted file to the harddisk
            string root = HttpContext.Current.Server.MapPath("~/Files/");
            var provider = new MultipartFormDataStreamProvider(root);
            await Request.Content.ReadAsMultipartAsync(provider);

            //Get Logged in User Name
            var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
            var user = manager.FindById(User.Identity.GetUserId());

            //getting the user details and storing in the object
            Document model = new Document();
            model.TypeId = Convert.ToInt32(provider.FormData["TypeId"]);
            model.TypeName = provider.FormData["TypeName"];
            model.LocationId = Convert.ToInt32(provider.FormData["LocationId"]);
            model.LocationName = provider.FormData["LocationName"];
            model.PipeId = Convert.ToInt32(provider.FormData["PipeId"]);
            model.PipeName = provider.FormData["PipeName"];
            model.CompanyId = Convert.ToInt32(provider.FormData["CompanyId"]);
            model.CompanyName = provider.FormData["CompanyName"];
            model.PlantId = Convert.ToInt32(provider.FormData["PlantId"]);
            model.PlantName = provider.FormData["PlantName"];
            model.CounterPartyId = Convert.ToInt32(provider.FormData["CounterPartyId"]);
            model.CounterPartyName = provider.FormData["CounterPartyName"];
            string docDate = provider.FormData["DocumentDate"];
            model.DocumentDate = DateTime.Parse(docDate.Trim('"'));
            model.UploadedBy = user.Name;
            model.UploadDate = DateTime.Now;
            model.DocumentUrl = provider.FormData["DocumentUrl"];

            //if there is a file then save that file to the desired location
            if (provider.FileData.Count > 0)
            {
                MultipartFileData fileData = provider.FileData[0];
                FileInfo fi = new FileInfo(fileData.LocalFileName);

                //getting the file saving path
                string clientFileName = fileData.Headers.ContentDisposition.FileName.Replace(@"""", "");
                if (clientFileName != "")
                {
                    string clientExtension = clientFileName.Substring(clientFileName.LastIndexOf('.'));
                    string dash = ("-");
                    var dt = model.DocumentDate.ToString("y").Replace('/', '-').Replace(':', '-');
                    var CompanyName = model.CompanyName.Replace('_', ' ');

                    string vPath = root.Replace(@"C:\Development\TransparentEnergy\TransparentEnergy", "~").Replace("\", "/");
                    string path = String.Format(CompanyName + dash + model.TypeName + dash + model.CounterPartyName + dash + dt + clientExtension);

                    string combination = Path.Combine(vPath, path);
                    model.DocumentUrl = combination;
                    FileInfo fiOld = new FileInfo(path);
                    if (fiOld.Exists)
                        fiOld.Delete();
                    //if (File.Exists())
                    fi.MoveTo(vPath);
                }
                else
                {
                    if (fi.Exists)
                        fi.Delete();
                }

            }
            //calling DB to save the user details
            using (var context = new ApplicationDbContext())
            {
                //save to db
                context.Documents.Add(model);
                context.SaveChanges();
            }
        }
        catch (Exception fex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, fex);
        }
        //sending the confirmation or error back to the user
        return Request.CreateResponse(HttpStatusCode.OK);
    }

这有效!

 public async Task<HttpResponseMessage> Post()
    {

        try
        {
            //saving the posted file to the harddisk
            //string root = HttpContext.Current.Server.MapPath("~/Files/");
            string root = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["~/Files/"]);
            var provider = new MultipartFormDataStreamProvider(root);
            await Request.Content.ReadAsMultipartAsync(provider);

            //Get Logged in User Name
            var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
            var user = manager.FindById(User.Identity.GetUserId());

            //getting the user details and storing in the object
            Document model = new Document();
            model.TypeId = Convert.ToInt32(provider.FormData["TypeId"]);
            model.TypeName = provider.FormData["TypeName"];
            model.LocationId = Convert.ToInt32(provider.FormData["LocationId"]);
            model.LocationName = provider.FormData["LocationName"];
            model.PipeId = Convert.ToInt32(provider.FormData["PipeId"]);
            model.PipeName = provider.FormData["PipeName"];
            model.CompanyId = Convert.ToInt32(provider.FormData["CompanyId"]);
            model.CompanyName = provider.FormData["CompanyName"];
            model.PlantId = Convert.ToInt32(provider.FormData["PlantId"]);
            model.PlantName = provider.FormData["PlantName"];
            model.CounterPartyId = Convert.ToInt32(provider.FormData["CounterPartyId"]);
            model.CounterPartyName = provider.FormData["CounterPartyName"];
            string docDate = provider.FormData["DocumentDate"];
            model.DocumentDate = DateTime.Parse(docDate.Trim('"'));
            model.UploadedBy = user.Name;
            model.UploadDate = DateTime.Now;
            model.DocumentUrl = provider.FormData["DocumentUrl"];

            //if there is a file then save that file to the desired location
            if (provider.FileData.Count > 0)
            {
                MultipartFileData fileData = provider.FileData[0];
                FileInfo fi = new FileInfo(fileData.LocalFileName);

                //getting the file saving path
                string clientFileName = fileData.Headers.ContentDisposition.FileName.Replace(@"""", "");
                if (clientFileName != "")
                {
                    string clientExtension = clientFileName.Substring(clientFileName.LastIndexOf('.'));

                    var dt = model.DocumentDate.ToString("y").Replace('/', '-').Replace(':', '-');
                    var CompanyName = model.CompanyName.Replace('_', ' ');

                    string vPath = root.Replace(@"C:\Development\TransparentEnergy\TransparentEnergy", "~").Replace("\", "/");
                    string fileName = String.Format("{0}-{1}-{2}-{3}{4}", CompanyName, model.TypeName, model.CounterPartyName, dt, clientExtension);
                    string combination = Path.Combine(vPath, fileName);
                    model.DocumentUrl = combination;

                    string physicalPath = HttpContext.Current.Server.MapPath("/Files");
                    string relativePath = Path.Combine(physicalPath, fileName);
                    FileInfo fiOld = new FileInfo(relativePath);
                    if (fiOld.Exists)
                        fiOld.Delete();
                    //if (File.Exists())
                    fi.MoveTo(relativePath);
                }
                else
                {
                    if (fi.Exists)
                        fi.Delete();
                }

            }
            //calling DB to save the user details
            using (var context = new ApplicationDbContext())
            {
                //save to db
                context.Documents.Add(model);
                context.SaveChanges();
            }
        }
        catch (Exception fex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, fex);
        }
        //sending the confirmation or error back to the user
        return Request.CreateResponse(HttpStatusCode.OK);
    }

我怀疑您的问题是因为 fi.MoveTo(serverFileName); 中的(命名错误的)serverFileName 实际上指向虚拟路径而不是物理路径。

请注意,我真的建议您重新考虑您的代码。一些例子:

  • string space = ("-");:“-”不是 space。
  • model.DocumentDate.ToString("y").Replace('/', '-').Replace(':', '-'); 看起来是个糟糕的日期格式。
  • string serverFileName = vPath + CompanyName + space + model.TypeName + space + model.CounterPartyName + space + dt + clientExtension; 首先,使用Path.Combine连接文件夹和文件名。其次,使用 string.Format 来创建文件名而不是长连接不是更好吗?第三,serverFileName 恕我直言,这是一个不好的名字,我称之为路径。
  • 我真的不明白 model.DocumentUrl 发生了什么:首先它获取 provider.FormData["DocumentUrl"] 的值,然后你检查 model.DocumentUrl 是否是一个空字符串(注意它首选使用 string.Empty) 并将其设置为 NULL 如果是这种情况,然后将其分配 serverFileName.