Vivek.anand34 Ответов: 2

Параметр size должен находиться между нулем и максимальным значением int32 в VB


уважаемый друг,

Мне нужно скачать очень большие zip-файлы: у меня есть такая ошибка при загрузке, как это решить:

The size parameter must be between zero and the maximum Int32 value. Parameter name: size Actual value was 5528988753.


Что я уже пробовал:

Protected Sub DownloadFile(ByVal sender As Object, ByVal e As EventArgs)
        Dim filePath As String = CType(sender, ImageButton).CommandArgument
        Response.ContentType = ContentType
        Response.AppendHeader("Content-Disposition", ("attachment; filename=" + Path.GetFileName(filePath)))
        Response.WriteFile(filePath)
        Response.End()
    End Sub

Wessel Beulink

Что такое ContentType? Если вы говорите о "больших" типах, используйте вместо них int64 и long.

Vivek.anand34

там где я использую int64 я не объявлял никаких значений int

2 Ответов

Рейтинг:
1

OriginalGriff

Файл слишком велик: количество байтов не укладывается в стандартное целое число (которое может содержать только значения от -2,147,483,648 до 2,147,483,647. Ваш файл составляет 5 528 988 753 байта и не может быть передан.

Заархивируйте файл в многослойный архив и перенесите его в меньшие куски.


Vivek.anand34

Тогда как скачать такие файлы.

Рейтинг:
1

Wessel Beulink

Ваш ответ заключается в том, что файл WriteFile имеет длину документа для записи в блоки. Это int32, который в вашем случае слишком велик. попробовать это:

Using ms As New MemoryStream(doc.ByteArray)
	Dim dataLengthToRead As Long = ms.Length
	Dim blockSize As Integer = If(dataLengthToRead >= 5000, 5000, CInt(dataLengthToRead))
	Dim buffer As Byte() = New Byte(dataLengthToRead - 1) {}


	Response.Clear()


	' Clear the content of the response
	Response.ClearContent()
	Response.ClearHeaders()


	' Buffer response so that page is sent
	' after processing is complete.
	Response.BufferOutput = True


	' Add the file name and attachment,
	' which will force the open/cance/save dialog to show, to the header
	Response.AddHeader("Content-Disposition", "attachment; filename=" + doc.FileName)


	' bypass the Open/Save/Cancel dialog
	Response.AddHeader("Content-Disposition", "inline; filename=" + doc.FileName);


	' Add the file size into the response header
	Response.AddHeader("Content-Length", doc.FileSize.ToString())


	' Set the ContentType
	Response.ContentType = "application/octet-stream"


	' Write the document into the response
	While dataLengthToRead > 0 AndAlso Response.IsClientConnected
		Dim lengthRead As Int32 = ms.Read(buffer, 0, blockSize)
		Response.OutputStream.Write(buffer, 0, lengthRead)
		Response.Flush()
		dataLengthToRead = dataLengthToRead - lengthRead
	End While


	Response.Flush()
	Response.Close()
End Using


'End the response
Response.[End]()


' Write the document into the response
While dataLengthToRead > 0 AndAlso Response.IsClientConnected
	Dim lengthRead As Int32 = ms.Read(buffer, 0, blockSize)
	Response.OutputStream.Write(buffer, 0, lengthRead)
	'Response.Flush(); // do not flush since BufferOutput = true
	dataLengthToRead = dataLengthToRead - lengthRead
End While

Response.Flush()
Response.Close()


Vivek.anand34

Что такое док здесь... Использование ms в качестве нового потока памяти (doc. ByteArray)

Wessel Beulink

Для тебя твоя клякса молнии.
Что-то вроде:
Dim doc как новый файловый поток("C:\Temp\result.zip", FileMode. Open)

Vivek.anand34

объект ByteArray, поскольку не является членом системы.Ио.хранилище FileStream

Wessel Beulink

Вам нужно преобразовать его в Корс.
Используйте это еще: byte [] data=File.ReadAllBytes("C:\\file.zip");

Vivek.anand34

Я использовал код с этого сайта: его выполнили..

https://www.codeproject.com/Tips/842832/How-to-Download-Large-Files-from-ASP-NET-Web-Forms

Wessel Beulink

то же самое ..... только c# u спросил vb