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

时间:2015-02-18 12:09:09

标签: c# asp.net-web-api2 fileinfo virtual-path

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

apiController

//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)显示

  

〜/文件/

异常发生在:

fi.MoveTo(serverFileName);

异常消息:

  

at System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)      在System.IO .__ Error.WinIOError()      在System.IO.FileInfo.MoveTo(String destFileName)      在TransparentEnergy.ControllersAPI.apiInvoiceController.d__0.MoveNext()in c:\ Development \ TransparentEnergy \ TransparentEnergy \ ControllersAPI \ SubmitApi \ apiInvoiceController.cs:第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);
    }

1 个答案:

答案 0 :(得分:1)

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

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

  • string 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
相关问题