通过本地 MemoryStream 缓冲区将文件从 FTP 传输到 Azure 云,结果是 "空 "文件

问题描述 投票:1回答:1

我正试图编写一个过程,将一个 txt 文件从 FTP 站点直接下载到 Azure 文件共享中,而无需首先将文件写入磁盘。我的计划是将数据下载到一个 MemoryStream,然后将流上传到云存储。程序运行,但生成的文件有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();
c# ftp azure-storage-blobs memorystream ftpwebrequest
1个回答
0
投票

写入流后,流指针在流的末端。所以当你把流传给 CloudFile.UploadFromStream它从指针(在最后)读取流到最后。因此,什么也没写。

ms.Position = 0;

类似的问题,请看: 使用SSH.NET从ByteArrayMemoryStream上传 - 文件被创建为空(大小为0KB)


虽然将数据复制到中间缓冲流是一种矫枉过正的做法。

使用 WebResponse.GetResponseStream 直接。

newFile.UploadFromStream(ftpResponse.GetResponseStream());
© www.soinside.com 2019 - 2024. All rights reserved.