Ошибка загрузки файла FtpWebRequest - PullRequest
0 голосов
/ 04 мая 2018

На моем веб-сайте я перечислил файл папки ftp, когда пользователь нажимает кнопку загрузки, я вызываю приведенный ниже код и загружаю файл на свой диск c. Однако я получаю сообщение об ошибке Доступ к пути "C: \ myvideo.flv" запрещен.

Код работает на сервере, и его необходимо сохранить на локальном диске ПК.

ASP.NET не авторизован для доступа к запрошенному ресурсу. Рассмотрите возможность предоставления прав доступа к ресурсу для удостоверения запроса ASP.NET. ASP.NET имеет базовый идентификатор процесса (обычно {MACHINE} \ ASPNET в IIS 5 или Network Service в IIS 6 и IIS 7 и настроенный идентификатор пула приложений в IIS 7.5), который используется, если приложение не олицетворяет собой. Если приложение олицетворяет себя с помощью идентификатора, идентификатором будет анонимный пользователь (обычно IUSR_MACHINENAME) или аутентифицированный пользователь запроса.

Я что-то пропустил в своей FtpWebRequest или по другой причине, вызвавшей эту проблему.

      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPRequest_Host + "myvideo.flv");
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        request.KeepAlive = true;
        request.UsePassive = true;
        request.UseBinary = true;

        request.Credentials = new NetworkCredential(FTPRequest_Username, FTPRequest_Password);

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();

        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);

        using (FileStream writer = new FileStream(@"C: \\" + "myvideo.flv", FileMode.Create, FileAccess.ReadWrite))
        {

            long length = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[2048];

            readCount = responseStream.Read(buffer, 0, bufferSize);
            while (readCount > 0)
            {
                writer.Write(buffer, 0, readCount);
                readCount = responseStream.Read(buffer, 0, bufferSize);
            }
        }

        reader.Close();
        response.Close();

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

Это вопрос разрешения! Если вы запускаете приложение в Visual Studio (IIS Express), откройте Visual Studio с Run as administrator. Если он размещен в IIS, Application Pool Identity должен иметь достаточные разрешения для доступа к диску C.

0 голосов
/ 04 мая 2018

вы путаетесь с тем, что делают

@"C: \\" + "myvideo.flv"

@ означает, что вам не нужно избегать обратной косой черты, поэтому мы получаем

@"C: \" + "myvideo.flv"

но есть странное место

@"C:\" + "myvideo.flv"

Так что все в порядке (при условии, что вы можете написать в корень своего C: \)

0 голосов
/ 04 мая 2018

Я думаю, что у вас может быть проблема, связанная с разрешениями, касающимися использования диска C:\, поскольку в Windows Vista и более поздних версиях этот диск рассматривается как системный диск, поэтому вам потребуется запустить код пользователем с повышенными привилегиями для сохранения видеофайла. в соответствующем приводе.

Если вы хотите избежать путаницы с правами доступа к файлу, попробуйте изменить путь для сохранения видеофайла с помощью Server.MapPath(), поскольку ASP.NET по умолчанию не разрешает прямой доступ к корню диска сервера:

using (FileStream writer = new FileStream(Server.MapPath("~/files/myvideo.flv", FileMode.Create, FileAccess.ReadWrite))
{
    // other stuff
}

Если вы все еще хотите сохранить видеофайл на системном диске с помощью предоставленного кода, запустите пул приложений с пользователем, обладающим правами администратора в удостоверении пула приложений.

Дополнительная информация:

Поскольку вы выполняете процесс запроса в среде ASP.NET, рассмотрите возможность предоставления разрешения на запись для текущего пользователя с идентификатором пула приложений с указанным путем к файлу / папке.

Аналогичная проблема:

FileStream не позволяет мне создавать файл на диске C

0 голосов
/ 04 мая 2018

Проблема не в FtpWebRequest. Это исключение происходит от объекта FileStream, поскольку, возможно, вы открыли видеофайл в каком-либо программном обеспечении (например, видеопроигрывателе), который запрещает запись объекта FileStream в этот файл.

...