我有一个服务器主机,只允许我通过ftp上传文件(在我的应用程序中有代码)。 所以我得到了一个有效的代码,让我上传文件到服务器除了一件奇怪的事情,如果我/用户登录(认证)我无法上传文件。这是在黑暗中拍摄,看看是否有人知道这是为什么。
我的错误信息是这个
Access to the path 'D:\hshome\PATH' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj) at System.IO.Directory.CreateDirectory(String path) at BasicProject.Mvc.Areas.Account.Controllers.ProfileController.Test(TestViewModel viewModel)
我用于上传的代码是
foreach (string item in Request.Files)
{
HttpPostedFileBase file = Request.Files[item];
if (file != null)
{
var path = "File";
var filePath = System.Web.HttpContext.Current.Server.MapPath("~/" + path + "/");
if (!Directory.Exists(filePath))
Directory.CreateDirectory(filePath);
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://SITE/SITE/" + path + "/" + file.FileName);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential("USER", "PASSWORD");
request.UsePassive = false;
var sourceStream = new StreamReader(file.InputStream);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
response.Close();
}
像我说的那样,如果我不登录并且在黑暗中拍摄,如果你遇到同样的问题我会更乐意获得解决方案。
答案 0 :(得分:0)
当您登录时,IIS正在尝试模拟您,并且您无法访问该文件夹,只有IIS用户才能访问该文件夹。
调试代码的几个选项。我在远程服务器上的偏好是在文件中的每个关键位置之前添加Response.write,例如在System.Web.HttpContext.Current.Server.MapPath("~/" + path + "/");
之后,它将告诉您是否已执行该步骤并且可能(如果您设置)有关请求的信息例如当前的安全上下文/用户。
示例:
foreach (string item in Request.Files)
{
HttpPostedFileBase file = Request.Files[item];
if (file != null)
{
Response.Write("A");
var path = "File";
var filePath = System.Web.HttpContext.Current.Server.MapPath("~/" + path + "/");
Response.Write("B");
if (!Directory.Exists(filePath))
{
Response.Write("C");
Directory.CreateDirectory(filePath);
}
Response.Write("D");
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://SITE/SITE/" + path + "/" + file.FileName);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential("USER", "PASSWORD");
request.UsePassive = false;
var sourceStream = new StreamReader(file.InputStream);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
response.Close();
}
如果你从那开始,并且你看到输出ABCD,那么你知道问题进一步减少,所以只需重复这个过程。 (我发现一次添加太多调试行太过分散注意力,但你可以。)
如果你停下来,说“ABC”,那么你知道Directory.CreateDirectory(filePath);
失败了。您可以在登录时尝试Response.Write(HttpContext.Current.User.Identity)
但未登录并查看所获得的内容。 (我不确定这是你想要的属性,但我现在无法测试它,所以你可以尝试查找或只是实验。)
答案 1 :(得分:0)
问题是我在进行身份验证时无法创建文件夹,因此在这种特定情况下,我会在用户注册时为其创建文件夹,并使用ftp上传代码显示其工作状态。