You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级VS2022与.NET8后Stream转文件/FTP上传出现0字节异常

解决Stream保存/上传后文件为0字节的问题

问题根源

调用encoder.Save(stream)完成写入后,MemoryStream的Position指针会停留在流的末尾。此时直接用该流执行上传、复制等读取操作时,会从末尾位置开始读取,自然获取不到任何数据,最终生成0字节文件。

修复方案

在使用流执行读取/上传/复制操作前,必须将流的Position重置为0(或调用stream.Seek(0, SeekOrigin.Begin)),让读取指针回到流的起始位置。

对应代码修改示例

  1. 原FTP上传代码修复:
var bitmap = AlbumCover0.Source as BitmapSource;
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));

var stream = new MemoryStream();
encoder.Save(stream);
stream.Position = 0; // 关键:保存后重置指针到流的开头

SessionOptions sessionOptions = FTP.Login();
using Session session = new();
session.Open(sessionOptions);
session.PutFile(stream, "/htdocs/Music/Covers/" + ItemTxt2.Text + ".png");
  1. 转byte[]后上传的代码修复:
var bitmap = AlbumCover0.Source as BitmapSource;
// ... 省略encoder初始化代码
encoder.Save(stream);

byte[] bytes = stream.ToArray(); // ToArray()会读取整个流,不受Position影响
stream.Position = 0; // 上传前必须重置指针

SessionOptions sessionOptions = FTP.Login();
// ... 省略session初始化代码
session.PutFile(stream, "/htdocs/Music/Covers/" + ItemTxt2.Text + ".png");
  1. 保存本地文件的代码修复:
var bitmap = AlbumCover0.Source as BitmapSource;
// ... 省略encoder初始化代码
encoder.Save(stream);
stream.Position = 0; // 复制到FileStream前重置指针

using (FileStream file = new FileStream("C:\\test.png", FileMode.Create))
{
     stream.CopyTo(file);
}

session.DoPutFiles("C:\\test.png", "/htdocs/Music/Covers/" + ItemTxt2.Text + ".png", false, new TransferOptions() { TransferMode = TransferMode.Binary });

补充说明

在.NET的Stream操作逻辑中,所有写入操作完成后,Position都会自动指向写入内容的末尾。后续的读取、复制、上传等操作默认从当前Position开始,因此必须手动重置Position到起始位置,才能正确读取到之前写入的全部内容。

内容的提问来源于stack exchange,提问作者RoseTeq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:31:24