vb.net文件上传使用ftp错误

时间:2011-05-09 06:24:52

标签: .net vb.net ftp

我正在使用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

任何人都可以帮助我。

谢谢,
 塞特希

4 个答案:

答案 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对于数组来说太大了。正如他所说,我也会做一个大块的阅读,大概是这样的:

  1. 从文件中读取(例如)64 kB。
  2. 将读取的64 kB写入流。
  3. 重复,直到读取/写入所有内容。
  4. 快速搜索引导我this example,这可能会给你一些想法。