我正在使用vb.net(.Net 4.0)使用ftp将文件上传到服务器。
我可以上传文件小尺寸(10MB),没有任何错误。 但是当我尝试上传超过2GB的大小时会导致以下错误
System.OverflowException:对于Int32,值太大或太小。
我正在使用代码..
Private Function UploadFileToServer(ByVal sSourceFile As String, ByVal sTargetFile As String) As Boolean
Dim objCredential As NetworkCredential
Dim objRequest As FtpWebRequest
Dim objReader As FileStream
Dim objStream As Stream
Dim objResponse As FtpWebResponse
Dim bResult As Boolean = False
Try
objRequest = DirectCast(WebRequest.Create(sTargetFile), FtpWebRequest)
'objRequest = FtpWebRequest.Create(sTargetFile)
objRequest.Method = WebRequestMethods.Ftp.UploadFile
objCredential = New NetworkCredential(USER_NAME, PASSWORD)
objRequest.Credentials = objCredential
objReader = New FileStream(sSourceFile, FileMode.Open)
Dim objBuffer(Convert.ToInt32(objReader.Length - 1)) As Byte
objReader.Read(objBuffer, 0, objBuffer.Length)
objReader.Close()
objRequest.ContentLength = objBuffer.Length
objStream = objRequest.GetRequestStream()
objStream.Write(objBuffer, 0, objBuffer.Length)
objStream.Close()
objResponse = DirectCast(objRequest.GetResponse, FtpWebResponse)
objResponse.Close()
bResult = True
Catch ex As Exception
End Try
Return bResult
End Function
它显示此行的错误
Dim objBuffer(Convert.ToInt32(objReader.Length - 1)) As Byte
任何人都可以帮助我。
谢谢,
塞特希
答案 0 :(得分:3)
2 ^ 31(2GB中的字节数)太大,无法存储在整数中。创建一个2GB Byte数组正在创建一个不可用的应用程序 - 您应该做的是为缓冲区和循环选择合理的大小,为缓冲区中的每个数据块执行objStream.Write
。简短的回答 - 在FTP发送时不要将整个文件加载到内存中!
答案 1 :(得分:0)
发生此错误是因为您要转换为int32
Dim objBuffer(Convert.ToInt32(objReader.Length - 1)) As Byte
使用int64而不会出现任何问题
Dim objBuffer(Convert.ToInt64(objReader.Length - 1)) As Byte
答案 2 :(得分:0)
功能“UploadFileToServer”无法上传文件大小> 50MB的文件。问题是当你上传一个需要很长时间的大文件然后删除与端口的连接时 - 有点像超时。我修复了代码,可以上传文件大小高达200GB。让它工作的诀窍是你需要创建一个循环来在每次迭代时上传一个字节并且需要检查与端口的连接是否有效,如果没有则需要重新建立连接到端口,然后尝试追加剩余的字节 - 而不是写入文件的字节。
更改objRequest.Method = WebRequestMethods.Ftp.UploadFile
在连接断开后立即到objRequest.Method = WebRequestMethods.Ftp.AppendFile
。
我已经尝试过其他的effords失败。
答案 3 :(得分:-1)
<强>更新强>
正如Will A指出的那样,2 GB对于数组来说太大了。正如他所说,我也会做一个大块的阅读,大概是这样的:
快速搜索引导我this example,这可能会给你一些想法。