2014-11-29 2 views
-5

Мне нужно загрузить двоичный файл, загруженный через http post. Я не могу загрузить файл.Загрузить двоичный файл по HTTP

Я могу видеть содержимое данных, но я не могу сохранить его на локальном диске.

это то, что я вижу в строке

--fUYxo2BFe6N Content-Disposition: форм-данных; Name = "данные"; имя файла = "EVLD_1.4.36_16_0993_0_000AAE0E0109_2D8A145A040000CC_0E0B1B0F3B29_0008.akt" Content-Type: применение/х-GZIP

<òÖwTcÈ»CDAA-æ7'fàZÇÇÈÉÀÀüA Èåp'Y9, Лп% ì @ 1 & <... Äg¬, , " 8 € dÐDÁ "x @/àü BD, !! Ä ƒ³e¹! Ê ™ è> è~ ™ ƒ'e + R9 * ÌG [+, amöÛÊ € äò0²ª2¬B † --fUYxo2BFe6N Content-Disposition: данные формы ; name = "SehirID"

16 --fUYxo2BFe6N Content-Disposition: form-data; name = "CihazTipiID"

64 --fUYxo2BFe6N Content-Disposition: form-data; name = "CihazAltTipiID"

1 --fUYxo2BFe6N Content-Disposition: form-data; name = "md5"

1FAFE4C67252889C75C526EA4313BE27 --fUYxo2BFe6N Content-Disposition: form-data; Name = "макинтош"

000AAE0E0109 --fUYxo2BFe6N--

Это мой исходный код для запросов listenint. Я могу обрабатывать запросы, но я не могу сохранить содержимое в файл.

общественный класс HttpProcessor { { { } public TcpClient socket; public HttpServer srv;

private Stream inputStream; 
    public StreamWriter outputStream; 

    public String http_method; 
    public String http_url; 
    public String http_protocol_versionstring; 
    public Hashtable httpHeaders = new Hashtable(); 


    private static int MAX_POST_SIZE = 10 * 1024 * 1024; // 10MB 

    public HttpProcessor(TcpClient s, HttpServer srv) 
    { 
     this.socket = s; 
     this.srv = srv; 

    } 


    private string streamReadLine(Stream inputStream) 
    { 
     int next_char; 
     string data = ""; 
     while (true) 
     { 
      next_char = inputStream.ReadByte(); 
      if (next_char == '\n') { break; } 
      if (next_char == '\r') { continue; } 
      if (next_char == -1) { Thread.Sleep(1); continue; }; 
      data += Convert.ToChar(next_char); 
     } 
     return data; 
    } 
    public void process() 
    { 
     // we can't use a StreamReader for input, because it buffers up extra data on us inside it's 
     // "processed" view of the world, and we want the data raw after the headers 
     inputStream = new BufferedStream(socket.GetStream()); 

     // we probably shouldn't be using a streamwriter for all output from handlers either 
     outputStream = new StreamWriter(new BufferedStream(socket.GetStream())); 
     try 
     { 
      parseRequest(); 
      readHeaders(); 
      if (http_method.Equals("GET")) 
      { 
       handleGETRequest(); 
      } 
      else if (http_method.Equals("POST")) 
      { 
       handlePOSTRequest(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Exception: " + e.ToString()); 
      writeFailure(); 
     } 
     outputStream.Flush(); 
     // bs.Flush(); // flush any remaining output 
     inputStream = null; outputStream = null; // bs = null;    
     socket.Close(); 
    } 

    public void parseRequest() 
    { 
     String request = streamReadLine(inputStream); 
     string[] tokens = request.Split(' '); 
     if (tokens.Length != 3) 
     { 
      throw new Exception("invalid http request line"); 
     } 

     http_method = tokens[0].ToUpper(); 
     http_url = tokens[1]; 
     http_protocol_versionstring = tokens[2]; 

     Console.WriteLine("starting: " + request); 
    } 

    public void readHeaders() 
    { 
     Console.WriteLine("readHeaders()"); 
     String line; 
     while ((line = streamReadLine(inputStream)) != null) 
     { 
      if (line.Equals("")) 
      { 
       Console.WriteLine("got headers"); 
       return; 
      } 

      int separator = line.IndexOf(':'); 
      if (separator == -1) 
      { 
       throw new Exception("invalid http header line: " + line); 
      } 
      String name = line.Substring(0, separator); 
      int pos = separator + 1; 
      while ((pos < line.Length) && (line[pos] == ' ')) 
      { 
       pos++; // strip any spaces 
      } 

      string value = line.Substring(pos, line.Length - pos); 
      Console.WriteLine("header: {0}:{1}", name, value); 
      httpHeaders[name] = value; 
     } 
    } 

    public void handleGETRequest() 
    { 
     srv.handleGETRequest(this); 
    } 

    private const int BUF_SIZE = 4096; 
    public void handlePOSTRequest() 
    { 
     // this post data processing just reads everything into a memory stream. 
     // this is fine for smallish things, but for large stuff we should really 
     // hand an input stream to the request processor. However, the input stream 
     // we hand him needs to let him see the "end of the stream" at this content 
     // length, because otherwise he won't know when he's seen it all! 

     Console.WriteLine("get post data start"); 
     int content_len = 0; 
     MemoryStream ms = new MemoryStream(); 
     if (this.httpHeaders.ContainsKey("Content-Length")) 
     { 
      content_len = Convert.ToInt32(this.httpHeaders["Content-Length"]); 
      if (content_len > MAX_POST_SIZE) 
      { 
       throw new Exception(
        String.Format("POST Content-Length({0}) too big for this simple server", 
         content_len)); 
      } 
      byte[] buf = new byte[BUF_SIZE]; 
      int to_read = content_len; 
      while (to_read > 0) 
      { 
       Console.WriteLine("starting Read, to_read={0}", to_read); 

       int numread = this.inputStream.Read(buf, 0, Math.Min(BUF_SIZE, to_read)); 
       Console.WriteLine("read finished, numread={0}", numread); 
       if (numread == 0) 
       { 
        if (to_read == 0) 
        { 
         break; 
        } 
        else 
        { 
         throw new Exception("client disconnected during post"); 
        } 
       } 
       to_read -= numread; 
       ms.Write(buf, 0, numread); 
      } 
      ms.Seek(0, SeekOrigin.Begin); 

      // String s1 = Encoding.UTF8.GetString(ms.ToArray()); 







     } 
     Console.WriteLine("get post data end"); 

     srv.handlePOSTRequest(this, new StreamReader(ms)); 


    } 
    private static Stream GetPostStream(string filePath, string boundary) 
    { 
     Stream postDataStream = new System.IO.MemoryStream(); 

     //adding form data 
     string formDataHeaderTemplate = Environment.NewLine + "--" + boundary + Environment.NewLine + 
     "Content-Disposition: form-data; name=\"{0}\";" + Environment.NewLine + Environment.NewLine + "{1}"; 

     //foreach (string key in formData.Keys) 
     //{ 
     // byte[] formItemBytes = System.Text.Encoding.UTF8.GetBytes(string.Format(formDataHeaderTemplate, 
     // key, formData[key])); 
     // postDataStream.Write(formItemBytes, 0, formItemBytes.Length); 
     //} 

     //adding file data 
     FileInfo fileInfo = new FileInfo(filePath); 

     string fileHeaderTemplate = Environment.NewLine + "--" + boundary + Environment.NewLine + 
     "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" + 
     Environment.NewLine + "Content-Type: application/vnd.ms-excel" + Environment.NewLine + Environment.NewLine; 

     byte[] fileHeaderBytes = System.Text.Encoding.UTF8.GetBytes(string.Format(fileHeaderTemplate, 
     "UploadCSVFile", fileInfo.FullName)); 

     postDataStream.Write(fileHeaderBytes, 0, fileHeaderBytes.Length); 

     FileStream fileStream = fileInfo.OpenRead(); 

     byte[] buffer = new byte[1024]; 

     int bytesRead = 0; 

     while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      postDataStream.Write(buffer, 0, bytesRead); 
     } 

     fileStream.Close(); 

     byte[] endBoundaryBytes = System.Text.Encoding.UTF8.GetBytes("--" + boundary + "--"); 
     postDataStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); 

     return postDataStream; 
    } 


    public void writeSuccess(string content_type = "text/html") 
    { 
     outputStream.WriteLine("HTTP/1.0 200 OK"); 
     outputStream.WriteLine("Content-Type: " + content_type); 
     outputStream.WriteLine("Connection: close"); 
     outputStream.WriteLine(""); 
    } 

    public void writeFailure() 
    { 
     outputStream.WriteLine("HTTP/1.0 404 File not found"); 
     outputStream.WriteLine("Connection: close"); 
     outputStream.WriteLine(""); 
    } 
} 

public abstract class HttpServer 
{ 

    protected int port; 
    TcpListener listener; 
    bool is_active = true; 

    public HttpServer(int port) 
    { 
     this.port = port; 
    } 

    public void listen() 
    { 
     listener = new TcpListener(port); 
     listener.Start(); 
     while (is_active) 
     { 
      TcpClient s = listener.AcceptTcpClient(); 
      HttpProcessor processor = new HttpProcessor(s, this); 
      Thread thread = new Thread(new ThreadStart(processor.process)); 
      thread.Start(); 
      Thread.Sleep(1); 
     } 
    } 

    public abstract void handleGETRequest(HttpProcessor p); 
    public abstract void handlePOSTRequest(HttpProcessor p, StreamReader inputData); 
} 

public class MyHttpServer : HttpServer 
{ 
    public MyHttpServer(int port) 
     : base(port) 
    { 
    } 
    public override void handleGETRequest(HttpProcessor p) 
    { 

     if (p.http_url.Equals("/Test.png")) 
     { 
      Stream fs = File.Open("../../Test.png", FileMode.Open); 

      p.writeSuccess("image/png"); 
      fs.CopyTo(p.outputStream.BaseStream); 
      p.outputStream.BaseStream.Flush(); 
     } 

     Console.WriteLine("request: {0}", p.http_url); 
     p.writeSuccess(); 
     p.outputStream.WriteLine("<html><body><h1>test server</h1>"); 
     p.outputStream.WriteLine("Current Time: " + DateTime.Now.ToString()); 
     p.outputStream.WriteLine("url : {0}", p.http_url); 

     p.outputStream.WriteLine("<form method=post action=/form>"); 
     p.outputStream.WriteLine("<input type=text name=foo value=foovalue>"); 
     p.outputStream.WriteLine("<input type=submit name=bar value=barvalue>"); 
     p.outputStream.WriteLine("</form>"); 
    } 

    public override void handlePOSTRequest(HttpProcessor p, StreamReader inputData) 
    { 


     Console.WriteLine("POST request: {0}", p.http_url); 
     string data = inputData.ReadToEnd(); 



     //SaveStreamToFile(inputData); 
     p.writeSuccess(); 
     p.outputStream.WriteLine("<html><body><h1>test server</h1>"); 
     p.outputStream.WriteLine("<a href=/test>return</a><p>"); 
     p.outputStream.WriteLine("postbody: <pre>{0}</pre>", data); 


    } 




    public void SaveStreamToFile(Stream stream) 
    { 
     if (stream.Length == 0) return; 

     // Create a FileStream object to write a stream to a file 
     using (FileStream fileStream = System.IO.File.Create(@"C:/EmreDenemeHttp.txt", (int)stream.Length)) 
     { 
      // Fill the bytes[] array with the stream data 
      byte[] bytesInStream = new byte[stream.Length]; 
      stream.Read(bytesInStream, 0, (int)bytesInStream.Length); 

      // Use FileStream object to write to the specified file 
      fileStream.Write(bytesInStream, 0, bytesInStream.Length); 
     } 
    } 
} 



public class TestMain 
{ 
    public static int Main(String[] args) 
    { 
     HttpServer httpServer; 
     if (args.GetLength(0) > 0) 
     { 
      httpServer = new MyHttpServer(Convert.ToInt16(args[0])); 
     } 
     else 
     { 
      httpServer = new MyHttpServer(80); 
     } 
     Thread thread = new Thread(new ThreadStart(httpServer.listen)); 
     thread.Start(); 
     return 0; 
    } 

} 
+0

магазин Содержимое в строке, создайте двоичный файл, напишите ему? –

+0

магазин Контент, но как? –

+1

* Как * вы * видите * это? * Почему вы не можете его сохранить? –

ответ

-1

Если вы имеете в виду, что видите это как строку в своем браузере, тип mime, отправленный вашим сервером вашему клиенту, может быть неправильным. По умолчанию он установлен в text/html. Это должно быть что-то вроде application/x-binary или, возможно, application/x-gzip Проверьте, какой тип mime извлекается вашим клиентом при отображении страницы и действиях на вашем сервере.

+0

Нет, я не вижу этого в браузере, Когда я отлаживаю код и записываю его в файл. Содержимое этого файла. –

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