簡體   English   中英

通過HTTP的二進制文件傳輸損壞

[英]Binary file transfer over http coming out corrupt

我正在執行以下操作,以上傳.pptx文件並將其保存在服務器的磁盤上。

當我嘗試打開文件時,它表示文件已損壞,無法打開。

這是因為我的編碼類型還是其他原因?

是否可以在POST中以二進制形式發送任意文件,然后將其以單個文件形式到達服務器?

    public static void ListenerCallback(IAsyncResult result)
    {
        HttpListener listener = (HttpListener)result.AsyncState;
        HttpListenerContext context = listener.EndGetContext(result);
        HttpListenerRequest request = context.Request;
        HttpListenerResponse response = context.Response;
        StreamReader reader = new StreamReader(request.InputStream);
        var res = reader.ReadToEnd();
        reader.Close();
        toLog.Add(res);
        NameValueCollection coll = HttpUtility.ParseQueryString(res);
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(res);
        File.WriteAllBytes("output.pptx", bytes);
        response.StatusCode = 200;
        response.ContentType = "text/html";
        using (StreamWriter writer = new StreamWriter(context.Response.OutputStream, Encoding.UTF8))
            writer.WriteLine("File Uploaded");
        response.Close();
    }

這是我要發送的郵件的郵遞員預覽:

POST  HTTP/1.1
Host: localhost:80
Content-Type: application/vnd.openxmlformats-officedocument.presentationml.presentation
Cache-Control: no-cache
Postman-Token: 9a04aa33-cd44-d238-6873-b330524f4ae5

undefined

如果我在np ++中打開源(非損壞)文件,我會看到編輯器選擇將其編碼為ANSI。

我目前正在使用UTF8對其進行編碼,但似乎沒有選擇使用ANSI進行編碼。

另外,在比較文件大小時,我丟失了一千字節的數據。

編輯:我當前的代碼是現在

這會將一個空文件寫入磁盤。

    public static void ListenerCallback(IAsyncResult result)
    {
        HttpListener listener = (HttpListener)result.AsyncState;
        HttpListenerContext context = listener.EndGetContext(result);
        HttpListenerRequest request = context.Request;
        HttpListenerResponse response = context.Response;

        StreamReader reader = new StreamReader(request.InputStream);
        var res = reader.ReadToEnd();
        reader.Close();
        Console.WriteLine(res);
        NameValueCollection coll = HttpUtility.ParseQueryString(res);

        using (var outp = File.OpenWrite("output.pptx"))
        {
            request.InputStream.CopyTo(outp);
        }

        response.StatusCode = 200;
        response.ContentType = "text/html";
        using (StreamWriter writer = new StreamWriter(context.Response.OutputStream, Encoding.UTF7))
            writer.WriteLine("File Uploaded");
        response.Close();
    }

我認為這是因為您以MIME類型“ text / html”而不是正確的類型“ application / vnd.openxmlformats-officedocument.presentationml.presentation”發送它。

我現在沒有時間對此進行測試,但是請嘗試以下操作:

public static void ListenerCallback(IAsyncResult result)
{
    HttpListener listener = (HttpListener)result.AsyncState;
    HttpListenerContext context = listener.EndGetContext(result);
    HttpListenerRequest request = context.Request;
    HttpListenerResponse response = context.Response;

    using (var out = File.OpenWrite("output.pptx"))
    {
        request.InputStream.CopyTo(out);
    }

    response.StatusCode = 200;
    response.ContentType = "text/html";
    using (StreamWriter writer = new StreamWriter(context.Response.OutputStream, Encoding.UTF8))
        writer.WriteLine("File Uploaded");
    response.Close();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM