2011-08-05 31 views
0

私はftpを使ってファイルをアップロードすることができるサーバーホストを所有しています。 私は動作するコードを持っていて、1つの奇妙なことを除いてサーバーにファイルをアップロードできます。私/ユーザーがログインしている(認証されていれば)ファイルをアップロードできません。これは暗闇の中で誰かがおそらくなぜこれが分かっているかを知るためのショットです。ログイン中にファイルをアップロード中にエラーが発生しました

私はあなたの場合には、ログインし、暗所での撮影をいけない場合、この作品言ったように私のエラーメッセージは、私がアップロードに使用し、この

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

関連する問題