【问题标题】:Sftp upload from memory stream asp.net从内存流asp.net Sftp上传
【发布时间】:2020-07-17 22:06:06
【问题描述】:

我正在尝试上传通过查询创建并通过 sftp 上传的 csv 文件。 我试图避免创建一个文件,然后通过将数据保存在内存中来读取文件以上传它。

提前致谢

var customerAddresses = addresses.Select(p => new { p.Customer.Name, p.Customer.AlternateName, p.City, p.StateProvince });
using (var memoryStream = new MemoryStream())
{
  //if you pass a file path to streamWriter it creates a csv with the correct format and data
  using (var streamWriter = new StreamWriter()) 
  {
    using (var csv = new CsvWriter(streamWriter))
    {
      csv.WriteRecords(customerAddresses);
      var fileName = DateTime.UtcNow.ToString(dateFromat) + destinationFileName;
      var privateKey = new PrivateKeyFile(sshKeyLocation);

      var connectionInfo = new PrivateKeyConnectionInfo(address,
         username,
         new PrivateKeyFile(sshKeyLocation)
      );
    
      memoryStream.Flush();
      using (var client = new SftpClient(connectionInfo))
      {
         client.Connect();
         client.ChangeDirectory(serverDirectory);
         client.UploadFile(memoryStream, fileName); //is always an empty file
      }
   }
}

【问题讨论】:

    标签: asp.net memorystream


    【解决方案1】:

    尝试在调用UploadFile和调用streamWriter.Flush();之前添加设置memoryStream位置以Seek开头,而不是memoryStream.Flush()

          streamWriter.Flush();
          memoryStream.Seek(0, SeekOrigin.Begin);
          using (var client = new SftpClient(connectionInfo))
          {
             client.Connect();
             client.ChangeDirectory(serverDirectory);
             client.UploadFile(memoryStream, fileName);
          }
    

    【讨论】:

    • 建议的更改并未解决问题。我编辑代码以使用 FileStream 读取现有文件并将其传递给 SftpClient。它成功创建了文件和数据。由于某种原因,它似乎不喜欢 MemoryStream。感谢您的回复。
    【解决方案2】:

    我一直不知道如何让它与 MemoryStream 一起工作,并改为写入文件,然后读取并上传该文件。

    public HttpResponseMessage Post([FromBody] CustomerIds[] CustomerIds)
    {
        try
        {
            if(CustomerIds.Length == 0)
            {
                throw new Exception("No customer ids passed in post body.");
            }
            else if (!File.Exists(sshKeyLocation))
            {
                throw new Exception("Missing ssh file.");
            }
    
            if(!Directory.Exists(localDirectory))
            {
                Directory.CreateDirectory(localDirectory);
            }
    
            var customerAddresses = _repository.GetPrimaryAddress(CustomerIds.Select(c => c.Id))
                .Select(p => new
                {
                    p.Customer.Name,
                    p.Customer.AlternateName,
                    p.City,
                    p.StateProvince
                }
            );
    
            if (customerAddresses == null || !customerAddresses.Any())
            {
                throw new Exception("No customer addresses found for selected customers.");
            }
    
            var fileName = DateTime.UtcNow.ToString(dateFromat) + destinationFileName;
            var localFilePath = Path.Combine(localDirectory, fileName);
    
            CreateFile(customerAddresses, localFilePath);
            UploadFile(localFilePath, fileName);
                       
            return new HttpResponseMessage(System.Net.HttpStatusCode.OK);
        }
        catch(Exception error)
        {
            logger.Error(error, error.Message);
            throw error;
        }
    }
    
    private void CreateFile(IEnumerable<object> customerAddresses, string filePath)
    {
        using (TextWriter streamWriter = new StreamWriter(filePath))
        using (var csv = new CsvWriter(streamWriter))
        {
            csv.WriteRecords(customerAddresses);
        }
    }
    
    private void UploadFile(string localFilePath, string destinationFileName)
    {
        var connectionInfo = new PrivateKeyConnectionInfo(address,
            username,
            new PrivateKeyFile(sshKeyLocation)
        );
    
        using (var fileStream = new FileStream(localFilePath, FileMode.Open))
        using (var client = new SftpClient(connectionInfo))
        {
            client.Connect();
            client.ChangeDirectory(serverDirectory);
            client.UploadFile(fileStream, destinationFileName);
        }
    }
    

    我已经没有时间继续尝试使用 MemoryStream 上传,我只需要使用此解决方案即可。很失望,我无法让它工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多