繁体   English   中英

通过本地 MemoryStream 缓冲区将文件从 FTP 传输到 Azure 云会导致“空”文件

[英]Transferring a file from FTP to Azure cloud via local MemoryStream buffer results in an 'empty' file

我正在尝试编写一个程序,该程序将从 FTP 站点直接下载 txt 文件到 Azure 文件共享中,而无需先将文件写入磁盘。 我的计划是将数据下载到MemoryStream ,然后将 stream 上传到云存储。 该过程运行,但生成的文件有 0 kb。 作为测试,我还尝试将MemoryStream数据写入本地文件。 当我这样做时,生成的文件与原始文件(8 kb)大小相同,但在记事本中打开时没有任何数据可见。 有人可以让我知道我要去哪里错了吗?

FtpWebRequest ftpRequest = (FtpWebRequest)FtpWebRequest.Create("ftp://ftp.domain.com:21/ftp/test/FileName.txt");
ftpRequest.Credentials = new NetworkCredential("userName", "password");
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
Stream ftpStream = ftpResponse.GetResponseStream();

//Write to a Azure File Share (results in 0 kb file)
using (MemoryStream ms = new MemoryStream())
{
    byte[] byteBuffer = new byte[2048];
    int bytesRead = ftpStream.Read(byteBuffer, 0, 2048);
    while (bytesRead > 0)
    {
        ms.Write(byteBuffer, 0, bytesRead);
        bytesRead = ftpStream.Read(byteBuffer, 0, 2048);
    }

    CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("accountName", "azureKey"), false);
    CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
    CloudFileShare fileShare = fileClient.GetShareReference(ConfigurationManager.AppSettings.Get("share-name"));
    CloudFileDirectory rootDirectory = fileShare.GetRootDirectoryReference();
    CloudFileDirectory destDir = rootDirectory.GetDirectoryReference("DestnationDirectory");
    var newFile = destDir.GetFileReference("NewDownloadedFile.txt");
    newFile.UploadFromStream(ms);
}

ftpStream.Close();
ftpResponse.Close();

写入 stream 后,stream 指针位于 stream 的末尾。 因此,当您将 stream 传递给CloudFile.UploadFromStream时,它会从指针(位于末尾)到末尾读取 stream。 因此,什么都没有写。

ms.Position = 0;

对于类似的问题,请参阅:
使用 SSH.NET 从 ByteArray/MemoryStream 上传 - 文件创建为空(大小为 0KB)


尽管将数据复制到中间缓冲区/流是一种过度杀伤力。

直接使用WebResponse.GetResponseStream

newFile.UploadFromStream(ftpResponse.GetResponseStream());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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