c # Загрузка файлов на FTP-сервер - PullRequest
1 голос
/ 13 мая 2010

У меня проблема с загрузкой файлов на FTP-сервер. У меня есть несколько кнопок. Каждая кнопка загружает разные файлы на FTP. При первом нажатии кнопки файл успешно загружен, но вторая и более поздние попытки не удаются. Это дает мне «Операция истекла». Когда я закрываю сайт и затем снова открываю его, я могу снова загрузить только один файл. Я уверен, что я могу переопределить файлы на FTP. Вот код:

protected void btn_export_OnClick(object sender, EventArgs e)
{
  Stream stream = new MemoryStream();

  stream.Position = 0;

  // fill the stream

  bool res = this.UploadFile(stream, "test.csv", "dir");

  stream.Close();
}

private bool UploadFile(Stream stream, string filename, string ftp_dir)
{
        stream.Seek(0, SeekOrigin.Begin);

        string uri = String.Format("ftp://{0}/{1}/{2}", "host", ftp_dir, filename);

        try
        {
            FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

            reqFTP.Credentials = new NetworkCredential("user", "pass");
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.KeepAlive = false;
            reqFTP.UseBinary = true;
            reqFTP.UsePassive = true;
            reqFTP.ContentLength = stream.Length;
            reqFTP.EnableSsl = true; // it's FTPES type of ftp

            int buffLen = 2048;
            byte[] buff = new byte[buffLen];
            int contentLen;

            try
            {
                Stream ftpStream = reqFTP.GetRequestStream();
                contentLen = stream.Read(buff, 0, buffLen);
                while (contentLen != 0)
                {
                    ftpStream.Write(buff, 0, contentLen);
                    contentLen = stream.Read(buff, 0, buffLen);
                }
                ftpStream.Flush();
                ftpStream.Close();
            }
            catch (Exception exc)
            {
                this.lbl_error.Text = "Error:<br />" + exc.Message;
                this.lbl_error.Visible = true;

                return false;
            }
        }
        catch (Exception exc)
        {
            this.lbl_error.Text = "Error:<br />" + exc.Message;
            this.lbl_error.Visible = true;

            return false;
        }

        return true;    
    }

Кто-нибудь знает, что может вызвать это странное поведение? Я думаю, что я закрываю все потоки точно. Может ли это быть связано с настройками ftp сервера? Админ сказал, что рукопожатие ftp никогда не происходило во второй раз.

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

начните с обертывания создания потока в предложении using.

        using(Stream stream = new MemoryStream())
        {
            stream.Position = 0;

            // fill the stream

            bool res = this.UploadFile(stream, "test.csv", "dir");

        }

Это обеспечит закрытие потока и удаление любых неуправляемых ресурсов, независимо от того, произошла ошибка или нет

1 голос
/ 04 января 2013

Я использовал ваш код, имел ту же проблему и исправил ее.

После закрытия потока вы должны прочитать reqFTP response, вызвав GetResponse() затем закройте ответ .Вот код, который решает проблему:

// Original code
ftpStream.Flush();
ftpStream.Close();

// Here is the missing part that you have to add to fix the problem
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
this.lbl_error.Text = "Response:<br />" + response.StatusDescription;
response.Close();
reqFTP = null;
this.lbl_error.Visible = true;

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

...