HttpWebRequest无法正确下载文件

时间:2016-04-24 05:13:30

标签: c# character-encoding httpwebrequest httpwebresponse

我无法使用WebClient,在任何人建议之前,因为它使我的合法应用程序看起来像迈克菲病毒。所以请不要建议。

我的服务器上存有binary.txt文件。它大约是1,240kb。但是,HttpWebRequest会将随机数量从1,300kb下载到1,700kb。

HttpWebRequest httpRequest = (HttpWebRequest)
WebRequest.Create("http://deviantsmc.com/binary.txt");
httpRequest.Method = WebRequestMethods.Http.Get;
HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
Stream httpResponseStream = httpResponse.GetResponseStream();
byte[] buffer = new byte[1240];
int bytesRead = 0;
StringBuilder sb = new StringBuilder();

//FileStream fileStream = File.Create(@"tcontent.txt");
while ((bytesRead = httpResponseStream.Read(buffer, 0, 1240)) != 0)
{
    sb.Append(Encoding.ASCII.GetString(buffer));
    //fileStream.Write(buffer, 0, bytesRead);
}
File.WriteAllText(@"tcontent1.txt", sb.ToString());

(服务器上的binary.txt文件的内容是ASCII格式,因此我也将编码字符串转换为ASCII格式。)

这是我编码该文本文件(在该服务器上)的方式

我的档案基本上是这样的:

byte[] bytes = File.ReadAllBytes("binary.txt");
String encBytes = Encoding.ASCII.GetString(bytes);
File.WriteAllText(file("binary.txt"), encBytes);

我联系了AV公司,关于WebDownloader被视为C#中的恶意导入,但他们没有回复我,所以我被迫使用HttpWebRequest

2 个答案:

答案 0 :(得分:5)

如果您的唯一目标是获取该二进制文件并将其写入磁盘,则只需使用CopyTo对象上存在的Stream方法将该流复制到文件中。

你的文件看起来像一个破损的zip文件btw,给出PK的第一个字符,并在zip规范中使用。

来自wikipedia

  

以ASCII字符串形式查看,其中写着“PK”,即发明人Phil Katz的缩写。因此,当在文本编辑器中查看.ZIP文件时,文件的前两个字节通常是“PK”。

我使用7-zip打开您的文件,因为Windows默认不接受它作为有效文件。它包含一个manifest.mf文件,但内容本身似乎缺失。该文件本身的大小为1.269.519字节。

HttpWebRequest httpRequest = (HttpWebRequest)
WebRequest.Create("http://deviantsmc.com/binary.txt");
httpRequest.Method = WebRequestMethods.Http.Get;
HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
Stream httpResponseStream = httpResponse.GetResponseStream();

// create and open a FileStream, using calls dispose when done
using(var fs= File.Create(@"c:\temp\bin.7z"))
{
     // Copy all bytes from the responsestream to the filestream
     httpResponseStream.CopyTo(fs);
}

答案 1 :(得分:2)

我认为你应该将整个二进制数据写入本地文件,而不是分段编码,你可以试试这个:

    HttpWebRequest httpRequest = (HttpWebRequest)
    WebRequest.Create("http://deviantsmc.com/binary.txt");
    httpRequest.Method = WebRequestMethods.Http.Get;
    HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
    Stream httpResponseStream = httpResponse.GetResponseStream();
    using (BinaryReader responseReader = new BinaryReader(httpResponseStream.GetResponseStream()))
    {
        byte[] bytes = responseReader.ReadBytes((int)response.ContentLength);
        using (BinaryWriter sw = new BinaryWriter(File.OpenWrite("tcontent1.txt")))
        {
            sw.Write(bytes);
            sw.Flush();
            sw.Close();
        }
    }

希望这可以提供帮助