使用HttpWebRequest获取JPG响应体异常,文件无效且大小翻倍
问题原因
- 核心错误在于使用
StreamReader读取二进制图片数据:StreamReader是为文本处理设计的工具,它会将响应流的二进制字节按ASCII编码解析为字符串,这个过程会篡改或丢失原始二进制数据(比如非ASCII范围的字节会被替换为占位符)。之后将该字符串转回字节数组,相当于对已损坏的数据做二次编码,最终导致文件大小翻倍、图片无法正常打开。 - 服务器返回的
image/jpeg属于二进制数据,必须直接处理字节流,不能经过文本编码/解码的中间步骤。
解决方法
修改响应处理逻辑,直接读取二进制响应流,跳过文本转换步骤:
var request = (HttpWebRequest)WebRequest.Create(myservice); var postData = string.Concat(HttpUtility.UrlEncode(mykey), "=", HttpUtility.UrlEncode(myvalue)); var postBytes = Encoding.ASCII.GetBytes(postData); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postBytes.Length; // 提交POST数据 using (var stream = request.GetRequestStream()) { stream.Write(postBytes, 0, postBytes.Length); } using (var response = (HttpWebResponse)request.GetResponse()) using (var responseStream = response.GetResponseStream()) using (var fileStream = new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.Write)) { // 直接将二进制流复制到文件,完全保留原始数据 responseStream.CopyTo(fileStream); }
补充说明
- 使用
Stream.CopyTo直接在响应流与文件流之间复制数据,全程不涉及文本编码转换,完美保留图片的原始二进制内容。 - 这种方式无需将整个响应加载到内存,处理大图片时更高效,也符合SQL Server CLR函数的运行环境要求。
内容的提问来源于stack exchange,提问作者Ivan Debono
相关产品推荐
相关产品推荐

