要求,每晚上传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
答案 0 :(得分:5)
如果要一次发送多个文件(如果订单不重要),您可以查看异步发送文件。查看各种Begin *和End *方法,例如FtpWebRequest.BeginGetResponse和FtpWebRequest.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();