FTP上传很慢,有没什么好的办法!

烟灰洒落键盘 2011-07-07 02:36:09
需要往远程的服务器上传一些文件,上传很慢,我的程序是这样设计的,首先在本地生成文件,然后把文件上传到服务器上,生成和上传10kb左右的文件需要10s左右,但是随着文件的变大,这个时间呈现指数级别上升,当文件达到100KB左右的时候,往往需要5分钟左右的时间,不知道是什么原因! 后来我用Filezilla手动上传却很快,不知道是不是我的程序写的有问题,第一次写用ftp上传的代码,请各位高手帮忙找找问题!(远程的服务器在新加坡),下面是我的代码:
public void GenerateIdoc()
{
if (Checked())
{
string s_ConsignmentId = "";
foreach (int RowIndex in ColumnSeleted)
{
s_ConsignmentId = s_ConsignmentId + staticMethodClass.ToStringAndTrim(dgvdata.Rows[RowIndex].Cells[1].Value.ToString()) + ",";
}
s_ConsignmentId = s_ConsignmentId.Substring(0, s_ConsignmentId.LastIndexOf(","));
string s_SqlConsignment = "SAP_ADMIN.P_INSERT_CONSIGNMENT";
string sOb_no = "";
string sConsignmentId = "";
string s_IDocSql = "SELECT OB_NO,INDEX_NO,DATA FROM SAP_ADMIN.BELKIN_EDI_IDOC_TAB WHERE OB_NO=@Ob_No ORDER BY INDEX_NO ASC";
string s_Sql = "SAP_ADMIN.P_Belkin_Create_Idoc_Table";
if (sqlExecute == null)
{
sqlExecute = new SQLExecute();
}
try
{

Hashtable hs_parameters = new Hashtable();
Hashtable hs_Para = new Hashtable();
hs_Para.Add("@ConsignmentId", s_ConsignmentId);
sqlExecute.executeProceduce(hs_Para, s_SqlConsignment);
hs_parameters.Add("@Return", 'N');
sqlExecute.executeProceduce(hs_parameters, s_Sql);
ReadIni Read = new ReadIni(staticVariableClass.s_IniFilePath);
FtpServerName = Read.ReadInivalue("FTPSERVE", "FTPSERVERNAME");
FtpUserName = Read.ReadInivalue("FTPSERVE", "FTPUSERNAME");
FtpPassword = Read.ReadInivalue("FTPSERVE", "FTPPASSWORD");

foreach (int RowIndex in ColumnSeleted)
{
Hashtable hs_CongimentId = new Hashtable();
sConsignmentId = staticMethodClass.ToStringAndTrim(dgvdata.Rows[RowIndex].Cells[1].Value.ToString());
hs_CongimentId.Add("@ConsignmentId", sConsignmentId);
string s_SqlSelect = "SELECT OB_NO FROM SAP_ADMIN.CONSIGNMENT_ORDER_TAB WHERE Consignment_Id=@ConsignmentId";
if (sqlExecute == null)
{
sqlExecute = new SQLExecute();
}
DataSet Ds_Consignment = sqlExecute.getDataset(s_SqlSelect, hs_CongimentId);
if (Ds_Consignment.Tables[0].Rows.Count > 0)
{
DataTableReader S_ObReader = Ds_Consignment.Tables[0].CreateDataReader();
while (S_ObReader.Read())
{
FilePath = Read.ReadInivalue("IDOCFILEPATH", "IDOC_PATH");
sOb_no = staticMethodClass.ToStringAndTrim(S_ObReader["OB_NO"].ToString());
Hashtable Hs_parameters = new Hashtable();
Hs_parameters.Add("@Ob_No", sOb_no);
DataSet Ds = new DataSet();
Ds = sqlExecute.getDataset(s_IDocSql, Hs_parameters);

FilePath = FilePath + "\\" + "Idoc_" + sOb_no + ".txt";
FileStream fs = new FileStream(FilePath, FileMode.OpenOrCreate);
StreamWriter Sw = new StreamWriter(fs);

DataTableReader Sdr = Ds.Tables[0].CreateDataReader();
while (Sdr.Read())
{
Sw.Write(staticMethodClass.ToStringAndTrim(Sdr[2].ToString()) + "\r\n");
}
Sdr.Close();
Sw.Close();
fs.Close();
Upload(FilePath);
}
S_ObReader.Close();
}
string s_Sql2 = "UPDATE SAP_ADMIN.CONSIGNMENT_TAB SET S_FLAG_SEND='Y' WHERE Consignment_Id=@ConsignmentId ";
if (sqlExecute == null)
{
sqlExecute = new SQLExecute();
}
sqlExecute.executeSQL(hs_CongimentId, s_Sql2);
}
}
catch (Exception ex)
{
staticMethodClass.showInformationMessageBox(ex.Message, "Information");
return;
}
staticMethodClass.showInformationMessageBox("IDoc File haves been send to Ftp! ", "Infomation");
}
else
{
staticMethodClass.showInformationMessageBox("Pls Select the data", "Information");
}
}


public void Upload(string filename)
{
FileInfo fileInf = new FileInfo(filename);
string Uri = "ftp://" + FtpServerName + "/" + fileInf.Name;
Connect(Uri);
ReqFtp.KeepAlive = false;
ReqFtp.Method = WebRequestMethods.Ftp.UploadFile;
ReqFtp.ContentLength = fileInf.Length;
int BuffLength = 2048;
byte[] buff = new byte[BuffLength];
int ContentLen;
FileStream Fs = fileInf.OpenRead();
try
{
Stream Strm = ReqFtp.GetRequestStream();
ContentLen = Fs.Read(buff, 0, BuffLength);
while (ContentLen != 0)
{
Strm.Write(buff, 0, ContentLen);
Strm.Flush();
ContentLen = Fs.Read(buff, 0, BuffLength);
}
Strm.Close();
Fs.Close();
}
catch (Exception ex)
{
staticMethodClass.showInformationMessageBox("Upload Error:" + ex.Message, "Information");
}
}
...全文
773 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
只在此山中 2011-09-16
  • 打赏
  • 举报
回复
参考:
//ftp建立连接
try
{
Request = (FtpWebRequest)WebRequest.Create(uri);
Request.Method = FtpMathod;
Request.UseBinary = true;
Request.Credentials = new NetworkCredential(this.UserName, this.Password);
if (this.Proxy != null)
{
Request.Proxy = this.Proxy;
}
return (FtpWebResponse)Request.GetResponse();
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
//ftp上传文件
try
{
Response = Open(new Uri(this.Uri.ToString() + RemoteFileName), WebRequestMethods.Ftp.UploadFile);
Stream requestStream = Request.GetRequestStream();
MemoryStream mem = new MemoryStream(FileBytes);

byte[] buffer = new byte[1024];
int bytesRead = 0;
int TotalRead = 0;
while (true)
{
bytesRead = mem.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
TotalRead += bytesRead;
requestStream.Write(buffer, 0, bytesRead);
}
requestStream.Close();
Response = (FtpWebResponse)Request.GetResponse();
mem.Close();
mem.Dispose();
FileBytes = null;
return true;
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}

也可以用第3方组件,速度会快点。
jshzp 2011-09-16
  • 打赏
  • 举报
回复
你找个国内甚至同城的服务器试试,就知道是否代码问题了。
另外注意一下是否你的客户端网速和服务器网速原因。
wangyue4 2011-09-16
  • 打赏
  • 举报
回复
以前做过,就在网上随便找了一个上传函数,没觉得很慢,C#不至于慢到那种程度。
烟灰洒落键盘 2011-09-16
  • 打赏
  • 举报
回复
看来是没有人回答了

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧