C# 通过二进制数据流远程传输与保存图片的方法
在 C# 开发中,有时需要将图片以二进制数据流的形式直接发送至远程服务,并在服务端接收后保存为文件。这种类似底层上传图片的处理方式,比标准的表单提交(Form-Data)更为灵活,常用于自定义协议或高性能传输场景。
远程发送图片数据流
客户端负责读取本地图片文件,将其转换为字节数组,并通过 HttpWebRequest 对象以 POST 方式发送到指定 URL。关键步骤包括设置请求内容为 multipart/form-data 类型(虽为流传输,但在此示例中沿用该 MIME 类型),写入请求流并读取响应。
/// <summary>
/// PostBinaryData - 发送二进制数据流到远程地址
/// </summary>
public string PostBinaryData(string url, byte[] bytes)
{
// 配置 HTTP 请求
HttpWebRequest wRequest = (HttpWebRequest)WebRequest.Create(url);
wRequest.ContentType = "multipart/form-data";
wRequest.ContentLength = bytes.Length;
wRequest.Method = "POST";
try
{
// 获取请求流并写入字节数组
Stream stream = wRequest.GetRequestStream();
stream.Write(bytes, 0, bytes.Length);
stream.Close();
// 获取服务器响应
HttpWebResponse wResponse = (HttpWebResponse)wRequest.GetResponse();
StreamReader sReader = new StreamReader(wResponse.GetResponseStream(), System.Text.Encoding.UTF8);
string str = sReader.ReadToEnd();
// 释放资源
sReader.Close();
return str;
}
finally
{
// 确保连接关闭
if (wResponse != null)
wResponse.Close();
}
}
参数说明与注意事项
- url: 服务端处理该请求的 API 地址。
- bytes: 图片的原始二进制数据,可通过
File.ReadAllBytes(path)获取。 - ContentType: 代码示例中使用
multipart/form-data,在实际纯流传输中也可以根据服务端要求设为application/octet-stream。
服务端接收并保存图片
服务端在接收到二进制流后,需要解析输入流并保存为文件。这里提供两种常见方法:一种是基于原始字节流的写入,另一种是利用 Bitmap 类直接解码。
public void GetBinaryData()
{
// 生成唯一的文件名,避免覆盖
string imgFile = DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg";
// 获取网站物理路径,拼接保存目录
string filePath = HttpContext.Current.Server.MapPath(imgFile);
// --- 方法一:直接读写二进制流 ---
int lang = HttpContext.Current.Request.TotalBytes;
byte[] bytes = HttpContext.Current.Request.BinaryRead(lang);
using (FileStream fStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
using (BinaryWriter bw = new BinaryWriter(fStream))
{
bw.Write(bytes);
}
// --- 方法二:利用 Bitmap 类处理(可选)---
try
{
using (MemoryStream ms = new MemoryStream(HttpContext.Current.Request.InputStream.ToArray()))
{
using (Bitmap img = new Bitmap(ms))
{
img.Save(filePath);
}
}
}
catch (ArgumentException)
{
// 如果输入流不是有效的图像格式,Bitmap 会抛出异常,建议捕获处理
}
// 返回操作结果
HttpContext.Current.Response.Write("ok");
}
方法对比与选择
- 方法一:
BinaryRead是最直接的二进制复制方式,速度快且无内存转换开销,适合确信前端传来的是标准图片数据的场景。 - 方法二:
Bitmap方式会对数据进行解码和重新编码,虽然增加了开销,但在某些情况下能自动处理颜色空间转换或修复轻微损坏的文件头。需注意ArgumentException异常,若传入的不是有效图像,此方法会失败。
排错指南
如果在调试过程中遇到问题,请检查以下方面:
- 空引用异常:确保
GetRequestStream()执行前请求已正确配置(如 Method 为 POST)。 - 长度不匹配:
ContentLength必须与bytes.Length一致,否则服务器可能截断数据。 - 保存路径权限:
Server.MapPath生成的路径需要 IIS 用户具有写入权限。
以上就是通过 C# 远程发送和接收数据流生成图片的详细内容,更多关于 C# 文件传输与流处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









