2011-08-05 141 views
0

我有一臺服務器主機,只允許我通過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

問題是我無法創建文件夾經過身份驗證,所以在這個特定的情況下,我爲用戶創建文件夾,當他們註冊時,並使用我上面顯示的工作良好的ftp上傳代碼。

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),但未登錄並查看所得結果。 (我不確定這是你想要的財產,但我現在無法測試它,所以你可以嘗試查看它或只是試驗。)

+0

我該怎麼做才能解決這個問題?我試圖模仿我的web.config,但我得到一個錯誤,說我不能在那裏。我應該怎樣Response.Write()? –

+0

你可能不想冒充你,你可能希望該文件被編寫爲應用程序池用戶(這可能因您的託管服務提供商而異,但我一無所知,主要是因爲您沒有提及它)。您是否嘗試詢問主持人如果他們知道發生了什麼事情? – yakatz