![](/img/trans.png)
[英]Is it possible to upload a CSV file to an SFTP server directly from a MemoryStream?
[英]How to upload a file from a MemoryStream to an FTP server
我创建了一个简单的应用程序,它收集表单数据,在内存中生成一个 XML 作为MemoryStream
对象,然后使用 SMB 将 XML 传送到服务器。 SMB 的交付方式很简单:
var outputFile = new FileStream($@"{serverPath}\{filename}.xml", FileMode.Create);
int Length = 256;
Byte[] buffer = new Byte[Length];
int bytesRead = stream.Read(buffer, 0, Length);
while (bytesRead > 0)
{
outputFile.Write(buffer, 0, bytesRead);
bytesRead = stream.Read(buffer, 0, Length);
}
但是,我需要使用 FTP(使用凭据)创建替代交付方法。 我不想重写我的 XML 方法,因为在内存中创建它可以节省写入磁盘的时间,这在过去我们的环境中一直是个问题。
我找不到任何示例来解释(对于编码能力非常有限的人)如何完成这样的事情。
通常,当我需要将文件上传到 FTP 服务器时,我会使用以下方法:
using (var client = new WebClient())
{
client.Credentials = new NetworkCredential("user", "pass");
client.UploadFile(uri, WebRequestMethods.Ftp.UploadFile, filename.xml);
}
这可以适应从MemoryStream
而不是磁盘上的文件上传吗? 如果没有,我可以通过什么其他方式将MemoryStream
上传到 FTP 服务器?
要么使用FtpWebRequest
,如您在使用 C# 将可流式传输的内存中文档 (.docx) 上传到 FTP 中所见? :
WebRequest request =
WebRequest.Create("ftp://ftp.example.com/remote/path/filename.xml");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(username, password);
using (Stream ftpStream = request.GetRequestStream())
{
memoryStream.CopyTo(ftpStream);
}
或使用WebClient.OpenWrite
(您也可以在@Neptune 的回答中看到):
using (var webClient = new WebClient())
{
const string url = "ftp://ftp.example.com/remote/path/filename.xml";
using (Stream uploadStream = client.OpenWrite(url))
{
memoryStream.CopyTo(uploadStream);
}
}
同样,您现有的FileStream
代码可以简化为:
using (var outputFile = File.Create($@"{serverPath}\{filename}.xml"))
{
stream.CopyTo(outputFile);
}
虽然显然,更好的是避免中间MemoryStream
并将 XML 直接写入FileStream
和WebRequest.GetRequestStream
(使用它们的公共Stream
接口)。
您可以使用OpenWrite
/ OpenWriteAsync
方法来获取可以从任何源(流/数组/...等)写入的流。以下是使用OpenWrite
从MemoryStream
写入的示例:
var sourceStream = new MemoryStream();
// Populate your stream with data ...
using (var webClient = new WebClient())
{
using (Stream uploadStream = client.OpenWrite(uploadUrl))
{
sourceStream.CopyTo(uploadStream);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.