ошибка при загрузке файлов при входе в систему - PullRequest
0 голосов
/ 06 августа 2011

Я получил сервер, который позволяет мне загружать файлы только через 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();

                    }

как я уже сказал, это работает, если я не войду в систему, и если у вас возникла такая же проблема, я был бы более чем счастлив получить часть решения.

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Проблема заключалась в том, что я не мог создать папку во время аутентификации, поэтому в этом конкретном случае я создаю папки для пользователей, когда они регистрируются, и использую код загрузки ftp, который я показываю выше его рабочего качества.

0 голосов
/ 06 августа 2011

Когда вы входите в систему, 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), когда вы вошли в систему, но не вошли в систему, и посмотрите, что вы получите. (Я не уверен, что это свойство, которое вам нужно, но я не могу проверить его прямо сейчас, поэтому вы можете попробовать посмотреть его или просто поэкспериментировать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...