2013-04-29 4 views
0

Я пытаюсь разработать приложение, которое будет загружать большие файлы на веб-сервер под управлением PHP. Почти сразу, я наткнулся на проблему, что файл не разделить правильно.C# FileStream неправильно считывает байты

В настоящее время у меня есть этот кусок кода

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-х.

Я был бы рад, если бы вы могли сказать мне, что не так, и как исправить это.

+0

для spliting файла вы можете попробовать http://stackoverflow.com/questions/3967541/how-to-split-large-files-efficiently – Amitd

+0

Параметр 3 FileStream :: Read - это количество байтов. У вас это как длина массива минус ваш текущий индекс. Разве это не просто длина массива? – Mike

ответ

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

Спасибо, что реально работал !!!!! – J1and1

Смежные вопросы