2011-05-09 78 views
1

我正在使用vb.net(.Net 4.0)将文件上传到使用ftp的服务器。使用ftp的vb.net文件上传错误

我可以没有任何错误地上传文件小尺寸(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 

错误可以任何一个请帮助我。

谢谢,
塞特希

回答

-1

更新:

正如Will A指出,2 GB是用于阵列太大。正如他所建议的那样,我也会进行大块读取,大致如下:

  1. 从文件读取(例如)64kB。
  2. 将读取的64 kB写入流中。
  3. 重复,直到所有内容都被读取/写入。

快速搜索引导我到this example这可能会给你一些想法。

+0

嗨,谢谢你的回复,当我使用转换。ToInt64,我得到这个错误“System.OverflowException:算术运算导致溢出。” – Senthil 2011-05-09 06:31:12

+2

数组的最大元素数为2,147,483,647 - “2GB - 1” - 因此这种转换不会有任何帮助。 :( – 2011-05-09 06:33:09

+0

@ Will A谢谢!然后添加一个大块的阅读将是要走的路。 – 2011-05-09 06:43:35

0

此错误的发生是因为要转换为int32

Dim objBuffer(Convert.ToInt32(objReader.Length - 1)) As Byte 

使用的int64代替和将不会有任何问题

Dim objBuffer(Convert.ToInt64(objReader.Length - 1)) As Byte 
3

2^31(在2GB的字节数)是太在整数中存储的值很大。创建一个2GB字节数组是为了创建一个不可用的应用程序 - 你应该做的是为你的缓冲区和循环选择一个合理的大小,为缓冲区中的每个数据块执行objStream.Write。简短的回答 - 当FTP'ing时不要将整个文件加载到内存中!

+0

好的答案!我没有考虑这样做,但现在我会:) – 2015-02-22 23:30:04

0

功能“UploadFileToServer”无法上传文件大小大于50MB的文件。问题是,当你上传一个需要很长时间的大文件时,那么连接到端口的连接就会被丢弃 - 类似超时。我修复了代码,可以上传最大200GB的文件大小。窍门,使其工作是你需要创建一个循环上传每个迭代一个字节,并需要检查连接到端口是stil有效,如果不是,那么你需要重新建立连接到端口和然后尝试追加剩余字节 - 不要将字节写入文件。

更改objRequest.Method = WebRequestMethods.Ftp.UploadFileobjRequest.Method = WebRequestMethods.Ftp.AppendFile在连接丢失之后。

我试过其他的效果失败。