我一直坚持将文件上传的虚拟路径保存到我的数据库。没有虚拟路径,文件被保存,数据库中的 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) 显示
〜/文件/
异常发生在:
fi.MoveTo(serverFileName);
异常消息:
在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 在 System.IO.__Error.WinIOError() 在 System.IO.FileInfo.MoveTo(String destFileName) 在 TransparentEnergy.ControllersAPI.apiInvoiceController.d__0.MoveNext() 在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);
}