【问题标题】:Upload a file to an FTP server from a string or stream将文件从字符串或流上传到 FTP 服务器
【发布时间】:2017-01-06 14:06:32
【问题描述】:

我正在尝试在 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()) { }

【问题讨论】:

    标签: c# .net ftp webrequest ftpwebrequest


    【解决方案1】:

    我这样做是为了将 xml 文件发送到 FTP。它工作正常。我认为是你需要的。

     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();
    

    问候!

    【讨论】:

    • 这不是通用解决方案。您将内容转换为 UTF-8。所以它只能处理文本文件。而且你没有说明这个限制。此外,对文本文件使用二进制模式似乎也不对。
    【解决方案2】:

    只需将您的流复制到 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      相关资源
      最近更新 更多