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的时候,就会读取过多的字节,造成乱码,如果在下载之前,能够获取到文件的大小信息,可动态的设置这个缓冲区的大小。

总结

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

时间: 2024-10-15 08:03:22

HttpWebRequest下载文件,乱码问题解决方案的相关文章

Amazon 解决下载文件乱码

Amazon 解决下载文件乱码 大家在做多个站点的时候,可能会遇到下载下来的报告文件出现乱码. 法国站点和意大利站点均会出现这样的情况,那怎么解决呢? 这是由于编码的问题而导致,在我们读取数据插入到本地数据库的时候,不妨先将格式转成对应国家能正确识别的格式. 在文档中也有看到. 还要一个问题需要说明,由于操作系统设置默认语言的原因,在小国家站点,我们下载下来的报告可能会出现乱码的情况.这种情况很正常,在调用接口的时候,也没有办法去解决直接下载就出现正常编码. 现在的方法是将下载下来的乱码文件,通

下载文件乱码问题

1.下载文件乱码问题     new String("免责声明.pdf".getBytes("utf-8"), "ISO-8859-1"): 2.图片转blog String path = request.getSession().getServletContext().getRealPath("/");                String a = picturename2.replace(              

javaEE杂项 --下载文件乱码的不同解决方案

在下载文件时,常见的方法: public void getuseopdoc(HttpServletResponse response) throws Exception { try { String filename = "某某文件"; InputStream inputStream = getClass().getResourceAsStream("/doc/"+filename+".doc"); response.reset(); respo

解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题

最近做项目,采用Spring MVC做控制层,下载文件的文件名总是在主流浏览器上显示乱码,Firfox不是乱码了,IE下又成了乱码.也是烦,IE总是独树一帜,没办法,只能让程序去适应,在网上也搜索了很多,但是解决的不理想,主要是IE11作为主流浏览器后,很多人之前提出的方案都失效了. 简单来说,之前使用request获取header中的user-agent,通过MSIE关键字来判断是否是IE浏览器,如果是IE浏览器,使用utf-8对文件名编码就可以了.然而,IE11的user-agent已经没有

ServletResponse下载文件乱码

借助于强大的搜索引擎和本地试验. 通常来说解决乱码两个方式: 1.把文件名(包括汉字)编码成UTF-8 String downloadOrigalFile = "测试文件乱码.xlsx"; String downloadFileName = java.net.URLEncoder.encode(downloadOrigalFile, "UTF-8"); response.setHeader("Content-Disposition", "

springboot ResponseEntity&lt;byte[]&gt; 下载文件乱码

spring3以后添加httpMessageConverter消怎机制.其中可以通过org.springframework.http.ResponseEntity<byte[]>对象下载文件. pom文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

读写文件编码方式不一致导致文件乱码的解决方案

这几天在弄一个android应用的数据加密功能,为了避免加密.解密算法被破解,我将加密和解密的核心算法用JNI封装起来,只把接口暴露给java层. 工作流程是这样的: 1.通过自己写的加密解密工具将数据加密: 2.将加密的数据放在android的asserts文件夹下: 3.在首次使用数据时将asserts文件夹下的数据拷贝到一个隐藏文件夹下: 4.解密隐藏文件夹下的文件. 在用加密工具将数据加密好了,在程序解密这个数据文件的过程中,发现解密出来的文件是原来文件大小的2倍,并且全是乱码,跟踪发现

通过js跳转url下载包含中文的文件乱码问题解决方案(java)

问题描述: 通过js 跳转url的方式下载中文文件,因为中文文件名乱码找不到文件. 解决方案: 经过测试在tomcat 8 及以上不会出现这个问题: 以下解决方案博主亲测有效,如果您有更好的解决方案,请直接留言.互相进步. 如果是使用 tomcat7 在conf.server.xml中添加如下配置: URIEncoding="UTF-8" 配置完整: <?xml version="1.0" encoding="UTF-8"?> <

微信浏览器不支持下载文件或应用解决方案--跳转到默认浏览器打开

在微信的内置浏览器(QQ内置浏览器也一样)里他屏蔽了下载链接,不管是app的下载链接,还是普通文件的链接都屏蔽了,这个问题有两个解决方案. 首先如果你是App下载链接就传到腾讯应用宝,但是这会给应用宝带来流量,如果二次下载折损率很高.其二就是提示引导用户在浏览器打开所以如果你没有将软件上传到应用宝里,或者你的文件不是APP,那么就需要第二种方法了,首先是需要判断用户的浏览器是否为微信内置浏览器,如果是弹出一个图层,提示用户点击右上角的三个点,然后点击在浏览器中打开即可.但是这种用户体验很差.经过