Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как сделать заливку на ftp множества файлов


Автор: t2000 21.10.2013, 12:57
Здравствуйте. Подскажите пожалуйста как можно залить на ftp множество файлов за одно подключение. Дело в том что на ftp стоит ограничение на количество подключений и отключений за определенное время. Я в начале сделал чтобы в цикле заливались файлы по одному (они брались из списка) , но так не проканало из-за этого ограничения. Подскажите плиз как сделать ? Я уже пол дня сижу , ничего не могу придумать . Вот мой код 
Код

FileWorker fileWorker = new FileWorker();
        public void FtpUload(string ftpserver, string login, string password, string localPath, string filename)
        {

            FtpWebRequest requestFTPUploader = (FtpWebRequest)WebRequest.Create(ftpserver + filename);
            requestFTPUploader.Credentials = new NetworkCredential(login, password);
            requestFTPUploader.Method = WebRequestMethods.Ftp.UploadFile;

            FileInfo fileInfo = new FileInfo(localPath + "//" + filename);
            FileStream fileStream = fileInfo.OpenRead();

            int bufferLength = 2048;
            byte[] buffer = new byte[bufferLength];

            Stream uploadStream = requestFTPUploader.GetRequestStream();
            int contentLength = fileStream.Read(buffer, 0, bufferLength);

            while (contentLength != 0)
            {
                uploadStream.Write(buffer, 0, contentLength);
                contentLength = fileStream.Read(buffer, 0, bufferLength);
            }

            uploadStream.Close();
            fileStream.Close();

            requestFTPUploader = null;
        }

Автор: jonie 21.10.2013, 20:09
Код

requestFTPUploader.KeepAlive = true;
requestFTPUploader.ConnectionGroupName = "MyUploadGroup";
requestFTPUploader.ServicePoint.ConnectionLimit = 1;
как минимум это надо использовать вам.
Но вообще имхо в .net хреновый "из-коробки" клиент FTP..

Автор: t2000 22.10.2013, 05:14
не помогло :(( 

Автор: Track 22.10.2013, 13:42
Цитата

как можно залить на ftp множество файлов за одно подключение. Дело в том что на ftp стоит ограничение на количество подключений и отключений за определенное время. 

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

Автор: jonie 22.10.2013, 14:15
Цитата(Track @  22.10.2013,  14:42 Найти цитируемый пост)

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

бред полный. Просто надо заливать файлы в рамках одного соединения последовательно.
Цитата(t2000 @  22.10.2013,  06:14 Найти цитируемый пост)
не помогло :((  

сдаётся мне вы нам врёте.

Вот я написал (чуть поправив):
Код

 class Program
    {
        static void Main(string[] args)
        {
            FtpUload("ftp://***.ru/", "***", "***", @"c:\temp\2012-12-21_124923.png", "/var/www/temp/test/2012-12-21_124923.png");
            FtpUload("ftp://***.ru/", "***", "***", @"c:\temp\2012-12-26_145930.png", "/var/www/temp/test/2012-12-26_145930.png");
            FtpUload("ftp://***.ru/", "***", "***", @"c:\temp\2013-01-23_120403.png", "/var/www/temp/test/2013-01-23_120403.png");
        }

        public static void FtpUload(string ftpserver, string login, string password, string localPath, string filename)
        {

            FtpWebRequest requestFTPUploader = (FtpWebRequest)WebRequest.Create(ftpserver + filename);
            requestFTPUploader.Credentials = new NetworkCredential(login, password);
            requestFTPUploader.Method = WebRequestMethods.Ftp.UploadFile;
            requestFTPUploader.KeepAlive = true;
            requestFTPUploader.ConnectionGroupName = "MyUploadGroup";
            requestFTPUploader.ServicePoint.ConnectionLimit = 1;

            FileInfo fileInfo = new FileInfo(localPath );
            FileStream fileStream = fileInfo.OpenRead();
            int bufferLength = 2048;
            byte[] buffer = new byte[bufferLength];
            Stream uploadStream = requestFTPUploader.GetRequestStream();
            int contentLength = fileStream.Read(buffer, 0, bufferLength);
            while (contentLength != 0)
            {
                uploadStream.Write(buffer, 0, contentLength);
                contentLength = fileStream.Read(buffer, 0, bufferLength);
            }
            uploadStream.Close();
            fileStream.Close();
            requestFTPUploader = null;
        }


    }

+добавил логирование:
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.diagnostics>
    <sources>
      <source name="System.Net" tracemode="protocolonly" maxdatasize="1024">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="System.Net" value="Information"/>
    </switches>
    <sharedListeners>
      <add name="System.Net"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="network.log"
      />
    </sharedListeners>
    <trace autoflush="true"/>
  </system.diagnostics>
</configuration>


Итог в логах:
Код

System.Net Information: 0 : [6516] FtpWebRequest#49911653::.ctor(ftp://***.ru//var/www/temp/test/2012-12-21_124923.png)
System.Net Information: 0 : [6516] Current OS installation type is 'Client'.
System.Net Information: 0 : [6516] RAS supported: True
System.Net Information: 0 : [6516] FtpWebRequest#49911653::GetRequestStream(Method=STOR.)
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Created connection from ***:56702 to ***:21.
System.Net Information: 0 : [6516] Associating FtpWebRequest#49911653 with FtpControlStream#35489797
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [220 ***.ru FTP server (Version 6.00LS) ready.]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [USER ***]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [331 Password required for ***.]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [PASS ********]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [230 User ***logged in.]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [OPTS utf8 on]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [500 OPTS utf8 on: command not understood.]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [PWD]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [257 "/var/www" is current directory.]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [TYPE I]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [200 Type set to I.]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [PASV]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [227 Entering Passive Mode (***)]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [STOR /var/www/temp/test/2012-12-21_124923.png]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [150 Opening BINARY mode data connection for '/var/www/temp/test/2012-12-21_124923.png'.]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [226 Transfer complete.]
System.Net Information: 0 : [6516] FtpWebRequest#49911653::(Releasing FTP connection#35489797.)
System.Net Information: 0 : [6516] FtpWebRequest#45795543::.ctor(ftp://***.ru//var/www/temp/test/2012-12-26_145930.png)
System.Net Information: 0 : [6516] FtpWebRequest#45795543::GetRequestStream(Method=STOR.)
System.Net Information: 0 : [6516] Associating FtpWebRequest#45795543 with FtpControlStream#35489797
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [PASV]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [227 Entering Passive Mode (***)]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [STOR /var/www/temp/test/2012-12-26_145930.png]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [150 Opening BINARY mode data connection for '/var/www/temp/test/2012-12-26_145930.png'.]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [226 Transfer complete.]
System.Net Information: 0 : [6516] FtpWebRequest#45795543::(Releasing FTP connection#35489797.)
System.Net Information: 0 : [6516] FtpWebRequest#65677972::.ctor(ftp://***.ru//var/www/temp/test/2013-01-23_120403.png)
System.Net Information: 0 : [6516] FtpWebRequest#65677972::GetRequestStream(Method=STOR.)
System.Net Information: 0 : [6516] Associating FtpWebRequest#65677972 with FtpControlStream#35489797
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [PASV]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [227 Entering Passive Mode (***)]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Sending command [STOR /var/www/temp/test/2013-01-23_120403.png]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [150 Opening BINARY mode data connection for '/var/www/temp/test/2013-01-23_120403.png'.]
System.Net Information: 0 : [6516] FtpControlStream#35489797 - Received response [226 Transfer complete.]
System.Net Information: 0 : [6516] FtpWebRequest#65677972::(Releasing FTP connection#35489797.)



как видите USER один раз была....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)