HttpWebRequest下载文件,乱码问题解决方案

写在前面

今天之所以会总结HttpWebRequest下载文件,主要是因为在使用该类下载文件的时候,有些地方需要注意一下,在实际的项目中遇到过这种问题,觉得还是有必要总结一下的。在下载文件时,最常见的就是下载的文件出现乱码。

一个例子

还是以前面介绍的restful接口为例吧,现在我要通过HttpWebRequest请求,来下载图片,可以这样来。

api地址为:http://localhost:21074/ImageService/api/1.jpg

关于restful imageservice的详细内容,请参考前面的内容,这里只贴出关键代码:

复制代码
        /// <summary>
        /// 根据图片名称取文件流
        /// </summary>
        /// <param name="imgUrl"></param>
        /// <returns></returns>
        public System.IO.Stream GetImageStream(string imgUrl)
        {
            var contentType = Path.GetExtension(imgUrl).Trim('.');
            WebOperationContext woc = WebOperationContext.Current;
            //根据请求的图片类型,动态设置contenttype
            woc.OutgoingResponse.ContentType = "image/" + contentType;
            string savePath = System.Web.HttpContext.Current.Server.MapPath("/Images");
            string filePath = Path.Combine(savePath, imgUrl);
            return File.OpenRead(filePath);
        }
复制代码

客户端请求代码

复制代码
            Uri url = new Uri("http://localhost:21074/ImageService/api/1.jpg");
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            using (Stream stream = request.GetResponse().GetResponseStream())
            {
                //文件流,流信息读到文件流中,读完关闭
                using (FileStream fs = File.Create(@"download.jpg"))
                {
                    //建立字节组,并设置它的大小是多少字节
                    int length = 1024;//缓冲,1kb,如果设置的过大,而要下载的文件大小小于这个值,就会出现乱码。
                    byte[] bytes = new byte[length];
                    int n = 1;
                    while (n > 0)
                    {
                        //一次从流中读多少字节,并把值赋给N,当读完后,N为0,并退出循环
                        n = stream.Read(bytes, 0, length);
                        fs.Write(bytes, 0, n); //将指定字节的流信息写入文件流中
                    }
                }
            }
复制代码

注意,这里在读取的时候,设置的缓冲1kb,虽然随度慢点,但保证数据的正确性,比如如果设置10kb,而文件大小小于这个数,在stream.Read的时候,就会读取过多的字节,造成乱码,如果在下载之前,能够获取到文件的大小信息,可动态的设置这个缓冲区的大小。

总结

这里主要总结,在项目中遇到一个问题。希望对你有所帮助。

posted @   wolfy  阅读(2902)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2014-06-21 [Bug]The test form is only available for requests from the local machine.
点击右上角即可分享
微信分享提示