【问题标题】:vb.net file upload using ftp Errorvb.net 文件上传使用 ftp 错误
【发布时间】:2011-05-09 06:24:51
【问题描述】:

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

谁能帮帮我。

谢谢,
森提尔

【问题讨论】:

    标签: .net vb.net ftp


    【解决方案1】:

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

    【讨论】:

    • 不错的答案!我没有考虑过这样做,但现在我会:)
    【解决方案2】:

    出现此错误是因为您正在转换为 int32

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

    改用int64不会有问题

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

    【讨论】:

      【解决方案3】:

      函数“UploadFileToServer”无法上传大于 50MB 的大文件。问题是当您上传一个需要很长时间的大文件时,与端口的连接就会断开 - 有点像超时。我已经修复了代码,可以上传最大 200GB 的文件。让它工作的技巧是你需要创建一个循环来上传每次迭代一个字节并且需要检查到端口的连接是否仍然有效,如果不是那么你需要重新建立连接到端口,然后尝试附加剩余的字节 - 不要将字节写入文件。

      更改objRequest.Method = WebRequestMethods.Ftp.UploadFile 连接断开后立即发送至objRequest.Method = WebRequestMethods.Ftp.AppendFile

      我尝试过其他努力都失败了。

      【讨论】:

        【解决方案4】:

        更新:

        正如Will A 指出的那样,2 GB 对于数组来说太大了。正如他所建议的,我也会进行分块读取,大致如下:

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

        快速搜索将我带到this example,这可能会给你一些想法。

        【讨论】:

        • 您好,感谢您的回复,当我使用 Convert.ToInt64 时,我收到此错误“System.OverflowException:算术运算导致溢出。”
        • 数组的最大元素数为 2,147,483,647 - “2GB - 1” - 所以这样的转换无济于事。 :(
        • @Will A 谢谢!然后添加分块读取将是要走的路。
        猜你喜欢
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多