我一直坚持将文件上传的虚拟路径保存到我的数据库。如果没有虚拟路径,则保存文件,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);
}
答案 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
。