Запишите документ непосредственно в поток запросов. Нет смысла использовать промежуточный MemoryStream
. И StreamReader
/StreamWriter
предназначены для работы с текстовыми файлами, а .docx
— это двоичный формат файла, поэтому их тоже не используйте.
WebRequest request = WebRequest.Create("ftp://ftp.example.com/remote/path/document.docx");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(username, password);
using (Stream ftpStream = request.GetRequestStream())
{
document2.SaveToStream(ftpStream, Spire.Doc.FileFormat.Docx);
}
Или используйте WebClient.OpenWrite
:
using (var webClient = new WebClient())
{
const string url = "ftp://ftp.example.com/remote/path/document.docx";
using (Stream uploadStream = client.OpenWrite(url))
{
document2.SaveToStream(uploadStream, Spire.Doc.FileFormat.Docx);
}
}
Вам понадобится только промежуточный MemoryStream
, если библиотеке Spire требуется поток с возможностью поиска, а Stream
, возвращаемый FtpWebRequest.GetRequestStream
, не является. Я не могу это проверить.
Если это так, используйте:
MemoryStream memoryStream = new MemoryStream();
document2.SaveToStream(memoryStream, Spire.Doc.FileFormat.Docx);
memoryStream.Seek(0, SeekOrigin.Begin);
WebRequest request = WebRequest.Create("ftp://ftp.example.com/remote/path/document.docx");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(username, password);
using (Stream ftpStream = request.GetRequestStream())
{
memoryStream.CopyTo(ftpStream);
}
Или, опять же, вы можете использовать WebClient.OpenWrite
, как в предыдущем примере.
См. также аналогичный вопрос Заархивируйте каталог и загрузите его на FTP-сервер, не сохраняя ZIP-файл локально на C#.
person
Martin Prikryl
schedule
26.11.2017
StreamReader
вместоStreamWriter
. Вы никогда ничего не пишете вWebRequest
. - person Camilo Terevinto   schedule 26.11.2017