上传多个FTP文件

时间:2010-03-05 04:09:03

标签: .net ftp ftpwebrequest

要求,每晚上传1500张jpg图片,下面的代码会多次打开并关闭连接,我想知道是否有更好的方法。

...这是一段代码片段,因此这里有一些变量在别处定义

Dim picClsRequest = DirectCast(System.Net.WebRequest.Create(ftpImagePath), System.Net.FtpWebRequest)
Dim picClsStream As System.IO.Stream

Dim picCount As Integer = 0
For i = 1 To picPath.Count - 1
    picCount = picCount + 1
    log("Sending picture (" & picCount & " of " & picPath.Count & "):" & picDir & "/" & picPath(i))
    picClsRequest = DirectCast(System.Net.WebRequest.Create(ftpImagePath & "/" & picPath(i)), System.Net.FtpWebRequest)
    picClsRequest.Credentials = New System.Net.NetworkCredential(ftpUsername, ftpPassword)
    picClsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile
    picClsRequest.UseBinary = True
    picClsStream = picClsRequest.GetRequestStream()

    bFile = System.IO.File.ReadAllBytes(picDir & "/" & picPath(i))
    picClsStream.Write(bFile, 0, bFile.Length)
    picClsStream.Close()

Next

一些意见:

是的,我知道picCount是多余的......那是深夜。

ftpImagePath,picDir,ftpUsername,ftpPassword都是变量

是的,这是未加密的

此代码工作正常,我正在寻求优化

相关问题:FTP Upload multiple files without disconnect using .NET

4 个答案:

答案 0 :(得分:5)

如果要一次发送多个文件(如果订单不重要),您可以查看异步发送文件。查看各种Begin *和End *方法,例如FtpWebRequest.BeginGetResponseFtpWebRequest.EndGetResponse等。

此外,您可以查看FtpWebRequest.KeepAlive属性,该属性用于保持连接打开/缓存以供重用。

嗯,您也可以尝试创建一个巨大的tar文件,并通过一个连接将单个文件发送到一个流中;)

答案 1 :(得分:0)

是否可以将文件压缩到不同的包中,例如创建15个zip文件,每个包含100个图像,然后上传zip,这样会更快更有效。

有动态创建zip的免费库(例如sharpZipLib)

答案 2 :(得分:0)

使用多线程 - 一次打开3-4个FTP连接并并行上传文件。

答案 3 :(得分:0)

使用某个第三方FTP客户端库怎么样?他们中的大多数都不会试图隐藏FTP不是无状态协议(与FtpWebRequest不同)。

以下代码使用我们的Rebex FTP/SSL,但还有许多其他代码。

// create client, connect and log in 
Ftp client = new Ftp();
client.Connect("ftp.example.org");
client.Login("username", "password");
client.ChangeDirectory("/ftp/target/fir");

foreach (string localPath in picPath)
{
   client.PutFile(localPath, Path.GetFileName(localPath));
}

client.Disconnect();

或(如果所有源文件都在同一文件夹中):

// create client, connect and log in 
Ftp client = new Ftp();
client.Connect("ftp.example.org");
client.Login("username", "password");

client.PutFiles(
  @"c:\localPath\*", 
  "/remote/path",
  FtpBatchTransferOptions.Recursive,
  FtpActionOnExistingFiles.OverwriteAll);

client.Disconnect();