Как загрузить файл из MemoryStream на FTP-сервер - PullRequest
2 голосов
/ 07 мая 2019

Я создал простое приложение, которое собирает данные формы, генерирует XML в памяти как объект MemoryStream и доставляет XML на сервер с использованием SMB. Способ доставки прост для 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-сервер?

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Вы можете использовать методы 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);
     }
}
1 голос
/ 07 мая 2019

Либо используйте FtpWebRequest, как вы можете видеть в Загрузить потоковый документ в памяти (.docx) на FTP с C #? :

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 может быть упрощенto:

using (var outputFile = new FileStream($@"{serverPath}\{filename}.xml", FileMode.Create))
{
    stream.CopyTo(outputFile);
}

Хотя очевидно, что лучше было бы избегать промежуточного MemoryStream и записывать XML напрямую в FileStream и WebRequest.GetRequestStream (используя их общий интерфейс Stream).

...