2016-08-25 2 views
1

Ich versuche, einen Teil einer Datei in C# mit einem HttpWebRequest herunterladen, und zwar erfolgreich, aber nur zu einem gewissen Grad. Während meine Methode funktioniert gut mit textbasierten Dateien (zB. .txt, .php, .html, etc.) scheint es nicht freundlich zu anderen Dingen wie .jpg, .png, usw. zu spielen, das ein Problem ist, weil es herunterladen sollte einfach gut, unabhängig vom Dateityp (Es ist nur ein Download, nicht etwas, um die Datei zu öffnen, so Dateityp ist irrelevant).Laden Sie einen Teil einer Datei mit HttpWebRequest ohne Header

Das Problem ist, beim Herunterladen von Text-basierten Dateien, es spielt nicht so gut mit anderen Dateitypen. Zum Beispiel habe ich versucht, die Methode für eine .jpg, und es hatte zusätzliche Daten am Anfang der Datei (möglicherweise HTTP Response Header?) Und war etwa 200 KB größer als die tatsächliche Dateigröße.

Ich verwende die folgende Methode, um die Dateien herunterzuladen (Ich habe die URL auf die richtige URL eingestellt (Ja, ich habe achtgeprüft, es ist die richtige URL.), Und ich habe Threads festgelegt 1 (also das Herunterladen der gesamten Datei), die für textbasierte Dateien funktioniert, aber nicht auf andere Dateitypen):

public static string DownloadSector(string fileurl, int sector) 
    { 
     string result = string.Empty; 
     HttpWebRequest request; 
     request = WebRequest.Create(fileurl) as HttpWebRequest; 

     //get first 1000 bytes 
     request.AddRange(sectorSize*sector, ((sector + 1) * sectorSize) - 1); 
     //request. 

     Console.WriteLine("Range: " + (sectorSize * sector) + " - " + (((sector + 1) * sectorSize) - 1)); 

     // the following code is alternative, you may implement the function after your needs 
     using (WebResponse response = request.GetResponse()) 
     { 
      Console.WriteLine("Content length:\t" + response.ContentLength); 
      Console.WriteLine("Content type:\t" + response.ContentType); 
      using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
      { 
       result = sr.ReadToEnd(); 
      } 
     } 
     return result; 
    } 

so eine Idee, was das Problem ist und wie dieses Problem beheben?

+0

Überprüfen Sie, was die Antwort sagt. – Blorgbeard

+0

Was ist "Sektor?" –

+0

@RobertHarvey "Sektor" ist nur der Teil der Datei zum Download. Wenn es also eine 10-MB-Datei gibt und du 2 Threads verwendest, lädt jeder Thread einen Sektor, wo Sektorgröße = Dateigröße/Threads, aka 2 Sektoren Sektorgröße 5 MB –

Antwort

2

Der HTTP-Text einer Bildantwort ist kein Bytestream, den Sie direkt in einem Bildbetrachter verwenden können. Bilder sind binär, während HTTP nur Zeichenfolgen erlaubt.

Stattdessen ist der HTTP-Körper in diesem Fall typischerweise (abhängig von Ihrer content negotiation, d. H. Ihre akzeptieren/Codierung Header) eine Base64 Zeichenfolge.

So diese

return result; 

dieser

return Convert.FromBase64String(result); 

(Ihre Rückgabetyp und wechseln Sie in byte[]) ändern.

Wenn das nicht funktioniert, überprüfen Sie Ihre Anforderungs- und Antwortheader visuell und prüfen Sie auf Komprimierung wie gzip oder deflate ... siehe auch this answer.

+0

Nun, es war eine Ausnahme und beschwerte sich, dass es ein Nicht-Basis-64-Zeichen enthielt. –

+0

Suchen Sie nach einem 'content-encoding'-Header. Kannst du auch einen Snip der Antwort einfügen, damit wir alle sehen können? –

+0

Es gibt nicht wirklich eine Möglichkeit, ein "Snip" der Antwort zu veröffentlichen, da es ein langer Haufen Unsinn ist, der das Bild macht, aber hier ist das erste Teil davon und ein Teil der Datei selbst: JFIF ; SCHÖPFER: gd-jpeg v1.0 (mit IJG JPEG v62), Qualität = 95 –

Verwandte Themen