2009-11-06 8 views
5

Ich versuche, eine Datei in Chunks an einen HttpHandler senden, aber wenn ich die Anfrage im HttpContext erhalten, ist der InputStream leer.Senden von Dateien in Chunks an HttpHandler

So ein: während ich nicht sicher bin, ob das Senden meiner HttpWebRequest gültig ist und b: beim Empfang Ich bin nicht sicher, wie der Strom in der Httpcontext

Jede Hilfe sehr geschätzt abzurufen!

Diese, wie ich meine Anfrage vom Client-Code machen:

private void Post(byte[] bytes) 
    { 
     HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost:2977/Upload"); 
     req.Method = "POST"; 
     req.ContentType = "application/x-www-form-urlencoded"; 
     req.SendChunked = true; 
     req.Timeout = 400000; 
     req.ContentLength = bytes.Length; 
     req.KeepAlive = true; 

     using (Stream s = req.GetRequestStream()) 
     { 
      s.Write(bytes, 0, bytes.Length); 
      s.Close(); 
     } 

     HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 
    } 

das ist, wie ich die Anfrage in dem Httphandler behandeln:

public void ProcessRequest(HttpContext context) 
    { 
     Stream chunk = context.Request.InputStream; //it's empty! 
     FileStream output = new FileStream("C:\\Temp\\myTempFile.tmp", FileMode.Append); 

     //simple method to append each chunk to the temp file 
     CopyStream(chunk, output); 
    } 
+0

Was ist CopyStream zu tun? Versuchen Sie es mit einem StreamReader und lesen Sie context.Request.TotalBytes Bytes davon. – configurator

Antwort

3

Ich vermute, es könnte verwirrend sein, dass Sie es hochladen als Form-codiert. aber das ist nicht das, was du sendest (außer du beschönigst etwas). Ist der MIME-Typ wirklich korrekt?

Wie groß sind die Daten? Benötigen Sie einen Chunked Upload? Einige Server mögen das in einer einzelnen Anfrage nicht. Ich wäre versucht, mehrere einfache Anfragen über WebClient.UploadData zu verwenden.

+0

Ich sende eine Datei. Die Daten können groß sein, deshalb möchte ich sie in Stücke schicken. Außerdem muss der Client-Code den Status der Übertragung (für eine Ladezeile) kennen. – teebot

+0

Yup WebClient.UploadData hat es geschafft! Danke Marc Gravell! – teebot

0

Ich habe die gleiche Idee und war erfolgreich beim Senden von Datei über Post httpwebrequest. Bitte beachten Sie die folgende Codebeispiel

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

Ich habe darüber gebloggt, sehen Sie die ganze Httphandler/HttpWebRequest Beitrag hier http://aspilham.blogspot.com/2011/03/file-uploading-in-chunks-using.html ich diese Hoffnung helfen