为什么 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
.
我一直坚持保存文件上传到我的数据库的虚拟路径。如果没有虚拟路径,文件将被保存,数据库中的 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
.