繁体   English   中英

如何将文件从 MemoryStream 上传到 FTP 服务器

[英]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 直接写入FileStreamWebRequest.GetRequestStream (使用它们的公共Stream接口)。

您可以使用OpenWrite / OpenWriteAsync方法来获取可以从任何源(流/数组/...等)写入的流。以下是使用OpenWriteMemoryStream写入的示例:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM