[英]C# HttpWebRequest POST data in chunk
字节数组的最大长度是多少? 我正在尝试创建一个字节数组,其长度为551858003 。 我在大约526 MB的zip文件上创建了文件。 但这给了我错误Out of memory exception
我正在将文件上传到google drive
。
在这里,我尝试了一些代码。 我正在使用以下代码读取zip文件的字节。
byte[] FileByteArray = null;
using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
{
if (storage.FileExists(fileName))
{
using (IsolatedStorageFileStream fileStream = storage.OpenFile(fileName,FileMode.Open,FileAccess.Read))
{
fileStream.Flush();
fileStream.Position = 0;
long len = fileStream.Length;
FileByteArray = new byte[len];
fileStream.Read(FileByteArray, 0, FileByteArray.Length);
//using (BinaryReader binReader = new BinaryReader(fileStream))
//{
// Int32 Filelength = Convert.ToInt32(fileStream.Length);
// FileByteArray = binReader.ReadBytes(Filelength);
//}
fileStream.Flush();
fileStream.Dispose();
fileStream.Close();
}
}
}
我该如何解决这个问题? 上传大文件时出现OutOfMemoryException
。 我可以上传约100MB。
这是我发送chunk
图像的方法
public void Images_ChunkRequst(string uploadURL, byte[] FileByteArray, int startIndex)
{
try
{
int chunkSize = 256 * 1024 * 2;
int totalChunks = (int)Math.Ceiling((double)FileByteArray.Length / chunkSize);
int endIndex = (int)(startIndex + chunkSize > FileByteArray.Length ? FileByteArray.Length : startIndex + chunkSize);
int length = endIndex - startIndex;
if (i < totalChunks)
{
CollectionIP = CheckInternet.Find();
if (CollectionIP.Count == 2 && DeviceNetworkInformation.IsWiFiEnabled)
NetworkIPaddress = IPAddress.Parse(CollectionIP[1]).ToString();
else if (CollectionIP.Count > 0 && DeviceNetworkInformation.IsWiFiEnabled)
NetworkIPaddress = IPAddress.Parse(CollectionIP[0]).ToString();
if (!string.IsNullOrEmpty(NetworkIPaddress))
{
i = i + 1;
var request = WebRequest.Create(uploadURL) as HttpWebRequest;
request.Method = "PUT";
request.Headers["Authorization"] = string.Format("Bearer {0} ", AccessToken);
request.ContentType = "application/zip";
request.ContentLength = length;
request.Headers["Content-Range"] = "bytes " + startIndex + "-" + (endIndex - 1) + "/" + FileByteArray.Length;
request.AllowWriteStreamBuffering = false;
request.BeginGetRequestStream(arPut =>
{
var request1 = (HttpWebRequest)arPut.AsyncState;
using (var dataStream = request1.EndGetRequestStream(arPut))
{
//getting exception here
dataStream.Write(FileByteArray.Skip(startIndex).Take(endIndex).ToArray(), 0, FileByteArray.Take(length).Count());
dataStream.Flush();
dataStream.Dispose();
dataStream.Close();
}
request1.BeginGetResponse(aPut =>
{
var request2 = (HttpWebRequest)aPut.AsyncState;
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);
var response = (HttpWebResponse)request2.EndGetResponse(aPut);
if (response.StatusCode.ToString() == "308") // Resume Incomplete
{
response.Dispose();
response.Close();
string packet = response.Headers["Range"];
string[] rng = packet.Remove(0, 6).Split('-');
Images_ChunkRequst(uploadURL, FileByteArray, Convert.ToInt32(rng[1]) + 1);
}
else if (response.StatusCode.ToString() == "500") //Internal Server Error
{
i = i - 1;
response.Dispose();
response.Close();
Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
}
else if (response.StatusCode.ToString() == "502") //Bad Gateway
{
i = i - 1;
response.Dispose();
response.Close();
Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
}
else if (response.StatusCode.ToString() == "503") //Service Unavailable
{
i = i - 1;
response.Dispose();
response.Close();
Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
}
else if (response.StatusCode.ToString() == "504") //Gateway Timeout
{
i = i - 1;
response.Dispose();
response.Close();
Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
}
else if (response.StatusCode == HttpStatusCode.NotFound) //Not Found
{
i = i - 1;
response.Dispose();
response.Close();
Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
}
else if (response.StatusCode == HttpStatusCode.OK) // upload complete.
{
Dispatcher.BeginInvoke(() =>
{
i = 0;// i must be 0 after each upload success
imgPass_Images.Visibility = Visibility.Visible;
this.LayoutRoot.IsHitTestVisible = true;
SystemTray.ProgressIndicator.IsIndeterminate = false;
SystemTray.IsVisible = false;
GetNextAutoOrder();
});
}
}, request1);
}, request);
}
else
{
this.LayoutRoot.IsHitTestVisible = true;
SystemTray.ProgressIndicator.IsIndeterminate = false;
SystemTray.IsVisible = false;
MessageBox.Show("Please check your internet connection.");
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error occured. Trying to send failed package.");
Images_ChunkRequst(uploadURL, FileByteArray, startIndex);
}
}
我在这里遇到异常dataStream.Write(FileByteArray.Skip(startIndex).Take(endIndex).ToArray(), 0, FileByteArray.Take(length).Count());
。 我已经尽力解决这个问题。 有人可以帮帮我吗? 我收到此异常Insufficient memory to continue the execution of the program
System.Array
的当前实现将Int32
用于其所有内部计数器等,因此,理论上最大的元素数是Int32.MaxValue
。 所以问题出在别的地方。
这与Array.Length
。 您的进程内存不足。 您应该分块进行分配。
这可能不是解决方案 ,但是您发布的代码存在一些问题:
using (IsolatedStorageFileStream fileStream = storage.OpenFile(fileName,FileMode.Open,FileAccess.Read))
{
fileStream.Flush();
fileStream.Position = 0;
long len = fileStream.Length;
FileByteArray = new byte[len];
fileStream.Read(FileByteArray, 0, FileByteArray.Length);
//using (BinaryReader binReader = new BinaryReader(fileStream))
//{
// Int32 Filelength = Convert.ToInt32(fileStream.Length);
// FileByteArray = binReader.ReadBytes(Filelength);
//}
fileStream.Flush();
fileStream.Dispose();
fileStream.Close();
}
而不是按照流的大小创建FileByteArray,也可以在块中进行处理,然后将结果写入内存流中(或者,如果它也支持在块中进行发送,则最好将其直接发送到API。)因此,基本上:
创建一个类似1024的字节数组(如果要从缓冲区中读取更大的数据,可以更大-但要避免太大)
循环读取:
byte[] buffer = new byte[1024];
int read = 0;
while((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
// write buffer[0:read] to memory location or temp file on disk (avoid Flushing for each write);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.