C#FileStream错误地读取字节

时间:2013-04-29 15:52:06

标签: c# filestream

我正在尝试开发一个应用程序,将大型文件上传到运行PHP的Web服务器。几乎立刻,我偶然发现文件没有正确拆分的问题。

目前我有这段代码

string adrese = "c:\\directory\\file.jpg";
int garums = 16384;
String ext = Path.GetExtension(adrese);

FileStream file = /*/File.Open(adrese, FileMode.Open);/*/
    new FileStream(adrese, FileMode.Open, System.IO.FileAccess.Read);
long fgar = file.Length; //100%
long counter = garums;
first = true;
byte[] chunk = new byte[garums];

while (true)
{
    int index = 0;
    //long Controll = counter+garums;
    while (index < chunk.Length)
    {
        int bytesRead = file.Read(chunk, index, chunk.Length - index);
        if (bytesRead == 0)
        {
            /*byte[] biti = new byte[index];
            for (int i = 0; i < index; i++)
            {
                biti[i] = chunk[i];
            }
            chunk = new byte[index];
            chunk = biti;*/
            break;
        }
        index += bytesRead;
    }

    if (index != 0) // Our previous chunk may have been the last one
    {
        byte[] biti = new byte[index];
        for (int i = 0; i < index; i++)
        {
            biti[i] = chunk[i];
        }
        chunk = new byte[index];
        chunk = biti;
        // index is the number of bytes in the chunk
        sutam(Convert.ToBase64String(chunk),ext);
    }

    double procentuali = ((counter * 100) / fgar);
    if (procentuali > 99)
    {
        procentuali = 100;
    }

    progressBar1.Value = (int)Math.Round(procentuali);
    label1.Text = "" + procentuali;

    counter = counter+garums;
    if (index != garums) // We didn't read a full chunk: we're done
    {
        return;
    }
}

file.Close();

如果我将garums设置为1,但是等待一年左右的人上传一个大小为多GB的文件,则一切正常。

如果你能告诉我什么是错的以及如何解决这个问题,我会很高兴的。

1 个答案:

答案 0 :(得分:3)

尝试将其改为以块的形式上传:

private void ConvertToChunks()  
{
    //Open file
    string file = MapPath("~/temp/1.xps");
    FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
    //Chunk size that will be sent to Server
    int chunkSize = 1024;
    // Unique file name
    string fileName = Guid.NewGuid() + Path.GetExtension(file);
    int totalChunks = (int)Math.Ceiling((double)fileStream.Length / chunkSize);
    // Loop through the whole stream and send it chunk by chunk;
    for (int i = 0; i < totalChunks; i++)
    {
        int startIndex = i * chunkSize;
        int endIndex = (int)(startIndex + chunkSize > fileStream.Length ?   fileStream.Length : startIndex + chunkSize);
        int length = endIndex - startIndex;

        byte[] bytes = new byte[length];
        fileStream.Read(bytes, 0, bytes.Length);
        ChunkRequest(fileName, bytes);
    }
}

private void ChunkRequest(string fileName,byte[] buffer)  
{  
    //Request url, Method=post Length and data.
    string requestURL = "http://localhost:63654/hello.ashx";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";

    // Chunk(buffer) is converted to Base64 string that will be convert to Bytes on  the handler.
    string requestParameters = @"fileName=" + fileName + "&data=" + HttpUtility.UrlEncode( Convert.ToBase64String(buffer) );

    // finally whole request will be converted to bytes that will be transferred to HttpHandler
    byte[] byteData = Encoding.UTF8.GetBytes(requestParameters);

    request.ContentLength = byteData.Length;

    Stream writer = request.GetRequestStream();
    writer.Write(byteData, 0, byteData.Length);
    writer.Close();
    // here we will receive the response from HttpHandler
    StreamReader stIn = new StreamReader(request.GetResponse().GetResponseStream());
    string strResponse = stIn.ReadToEnd();
    stIn.Close();
}