c# FileStream读取字节错误

本文关键字:错误 字节 读取 FileStream | 更新日期: 2023-09-27 18:11:26

我正在尝试开发一个应用程序,将大文件上传到运行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的文件呢?

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

c# FileStream读取字节错误

试试下面的方法:

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();
}