使用 MIME header 将文件保存到文件

save file with MIME header to file

我一定是漏掉了什么。我正在下载一个文件并希望将其保存为文件类型。我知道这应该以 jpg 格式结束,在这种情况下。

当我将字节数组保存到文件时,我得到以下信息:

--145ae7dc-e075-478c-8063-eeb765e0e15a
Content-Type: image/jpeg;
Content-Length: 41946
MIME-Version: 1.0

ÿØÿî Adobe d     ÿÃ   R G B ÿÄ             ÿÚ R G B   úÿ ×þ¿Úív¡

代码:

WebClient webClient = new WebClient();
webClient.Headers["Accept"] = textBoxMimeType.Text;

var uri = new Uri(url);
using (Stream webStream = webClient.OpenRead(uri))
{
    using (FileStream fileStream = new FileStream(outputFile, FileMode.Create))
    {
        var buffer = new byte[32768];
        int bytesRead;
        Int64 bytesReadComplete = 0;
        Int64 bytesTotal = Convert.ToInt64(webClient.ResponseHeaders["Content-Length"]);

        while ((bytesRead = webStream.Read(buffer, 0, buffer.Length)) > 0)
        {
             bytesReadComplete += bytesRead;
             fileStream.Write(buffer, 0, bytesRead);
        }
     }
}

我使用上面的是因为我的文件可能很大。

另一个文件显示为 "application/octet-stream"...

我也希望能够下载其他 mime 类型。

如何删除 MIME header 并保存二进制数据?

我试过 MimeKit 但它无法解析 body。

感谢

您可以用一种方法替换这些行:

webClient.DownloadFile(url, outputFile);

好吧,我希望有一个实用程序(我认为 chilkat 实际上可以为 jpg 等常见文件做到这一点,但我不打算花钱买一个工具)。

归结为 "magic numbers"。加载缓冲区然后在开始和结束处搜索 "magic numbers"(小心,我相信 jpg 可以有不同的起始编号)。

private void GetParseMime()
{
    byte[] beginPattern = new byte[0];
    byte[] endPattern = new byte[0];

    WebClient webClient = new WebClient();
    webClient.Headers["Accept"] = textBoxMimeType.Text;

    bool bBeginSeqFound = false;
    long savedBytesRead = 0;

    var uri = new Uri(url);
    using (Stream webStream = webClient.OpenRead(uri))
    {
        long finalContentLen = long.Parse(webClient.ResponseHeaders["Content-Length"]);

        using (FileStream fileStream = new FileStream(outputFilename, FileMode.Create))
        {
            var buffer = new byte[32768];
            int bytesRead;
            long bytesTotal = Convert.ToInt64(webClient.ResponseHeaders["Content-Length"]);

            while ((bytesRead = webStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                int len = bytesRead;

                //look for the start sequence
                if (!bBeginSeqFound)
                {
                    int i = IndexOfSequence(buffer, dcmBeginPattern, 0);
                    if (i > -1)
                    {
                        bBeginSeqFound = true;
                        buffer = buffer.Skip(i).Take(bytesRead - i).ToArray();
                        len = bytesRead - i;
                    }
                }
                else
                {
                    //look for end sequence
                    int i = IndexOfSequence(buffer, dcmEndPattern, 0);
                    if (i > -1)
                    {
                        buffer = buffer.Skip(0).Take(i).ToArray();
                        len = buffer.Length;
                    }
                }

                savedBytesRead += len;
                fileStream.Write(buffer, 0, len);
            }
        }
    }
}

这仅仅是个开始。这可能有很多问题。不处理多个文件...

吉娜