我将文件上传到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握手从未发生过第二次。
答案 0 :(得分:2)
首先将您的Stream创建包装在using子句中。
using(Stream stream = new MemoryStream())
{
stream.Position = 0;
// fill the stream
bool res = this.UploadFile(stream, "test.csv", "dir");
}
这将确保关闭流并且处理任何非托管资源,无论是否发生错误
答案 1 :(得分:1)
我使用了您的代码,遇到了同样的问题并修复了它。
关闭广告网后,您必须致电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;
您不必显示响应,只需获取并关闭它,我只是为了参考而显示它。