从字符串或流上传文件到FTP服务器

11

我想在FTP服务器上创建一个文件,但我只有数据的字符串或流和应该创建的文件名。是否有办法从流或字符串创建服务器上的文件(我没有权限创建本地文件)?

string location = "ftp://xxx.xxx.xxx.xxx:21/TestLocation/Test.csv";

WebRequest ftpRequest = WebRequest.Create(location);
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
ftpRequest.Credentials = new NetworkCredential(userName, password);

string data = csv.getData();
MemoryStream stream = csv.getStream();

//Magic

using (var response = (FtpWebResponse)ftpRequest.GetResponse()) { }
2个回答

11

只需将流复制到FTP请求流中:

Stream requestStream = ftpRequest.GetRequestStream();
stream.CopyTo(requestStream);
requestStream.Close();

对于一个字符串(假设内容是文本):

byte[] bytes = Encoding.UTF8.GetBytes(data);

using (Stream requestStream = request.GetRequestStream())
{
    requestStream.Write(bytes, 0, bytes.Length);
}

或者更好地使用StreamWriter

using (Stream requestStream = request.GetRequestStream())
using (StreamWriter writer = new StreamWriter(requestStream, Encoding.UTF8))
{
    writer.Write(data);
}
如果内容是文本,您应该使用文本模式:
request.UseBinary = false;

0

我制作了这个程序用于向FTP发送XML文件。它运行良好。我认为这是你所需要的。

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://XXXXXXXXXX//" + filename);
            request.Method = WebRequestMethods.Ftp.UploadFile;

            request.Credentials = new NetworkCredential("user", "pwd");
            request.UsePassive = true;
            request.UseBinary = true;
            request.KeepAlive = true;

            StreamReader sourceStream = new StreamReader(file);
            byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            sourceStream.Close();
            request.ContentLength = fileContents.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();

敬礼!


2
这不是通用解决方案。您将内容转换为UTF-8,因此它只能与文本文件一起使用。而且,您没有说明这个限制。此外,对于文本文件使用二进制模式似乎不正确。 - Martin Prikryl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接