C# 通过二进制数据流远程传输与保存图片的方法

认真发呆
认真发呆
发布时间:2026-10-13| 6人浏览过
原创

在 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 异常,若传入的不是有效图像,此方法会失败。

排错指南

如果在调试过程中遇到问题,请检查以下方面:

  1. 空引用异常:确保 GetRequestStream() 执行前请求已正确配置(如 Method 为 POST)。
  2. 长度不匹配:ContentLength 必须与 bytes.Length 一致,否则服务器可能截断数据。
  3. 保存路径权限:Server.MapPath 生成的路径需要 IIS 用户具有写入权限。

以上就是通过 C# 远程发送和接收数据流生成图片的详细内容,更多关于 C# 文件传输与流处理的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。