Загрузка файла vb.net с использованием ftp Ошибка - PullRequest
1 голос
/ 09 мая 2011

Я использую vb.net (.Net 4.0) для загрузки файла на сервер, используя ftp.

Я могу загрузить файл небольшого размера (10 МБ) без каких-либо ошибок. но когда я пытаюсь загрузить более 2 ГБ, это приводит к следующей ошибке

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

Может кто-нибудь, пожалуйста, помогите мне.

Спасибо
Senthil

Ответы [ 4 ]

3 голосов
/ 09 мая 2011

2 ^ 31 (количество байтов в 2 ГБ) слишком большое значение для хранения в целое число.Создание массива байтов 2 ГБ граничит с созданием непригодного для использования приложения - вместо этого вам нужно выбрать разумный размер для буфера и цикла, выполняя objStream.Write для каждого куска данных в буфере.Краткий ответ - не загружайте весь файл в память, когда его используете FTP!

0 голосов
/ 24 мая 2012

Функция «UploadFileToServer» не может загрузить файл с большим размером> 50 МБ. Проблема в том, что когда вы загружаете большой файл, который может занять много времени, после чего соединение с портом будет прервано. У меня исправлен код, и я могу загрузить файл размером до 200 ГБ. Хитрость, чтобы заставить его работать, заключается в том, что вам нужно создать цикл для загрузки одного байта на каждой итерации и проверить, является ли соединение с портом все еще действительным, если нет, то вам нужно восстановить соединение к порту, а затем попробуйте добавить оставшиеся байты - чтобы не записывать байты в файл.

Изменить objRequest.Method = WebRequestMethods.Ftp.UploadFile objRequest.Method = WebRequestMethods.Ftp.AppendFile сразу после разрыва соединения.

Я пробовал другие неудачи.

0 голосов
/ 09 мая 2011

Эта ошибка возникает из-за преобразования в int32

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

используйте вместо него int64, и проблем не будет

Dim objBuffer(Convert.ToInt64(objReader.Length - 1)) As Byte
0 голосов
/ 09 мая 2011

Обновление:

Как указано Will A , 2 ГБ слишком велики для массива. Как он предположил, я бы также прочитал фрагментарно, примерно так:

  1. Считать (например) 64 КБ из файла.
  2. Запишите чтение 64 КБ в поток.
  3. Повторяйте, пока все не будет прочитано / записано.

Быстрый поиск привел меня к этому примеру , который может дать вам некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...