2010-01-22 194 views
0

我想将多行文本框流式传输到FTP服务器上的文本文件中。有人能告诉我我哪里可能会出问题吗?将文本框上传到ftp C上的文本文件#

private void btnSave_Click(object sender, EventArgs e) 
{ 
    UriBuilder b = new UriBuilder(); 
    b.Host = "ftp.myserver.com"; 
    b.UserName = "user"; 
    b.Password = "pass"; 
    b.Port = 21; 
    b.Path = "/myserver.com/directories/" + selected + ".txt"; 
    b.Scheme = Uri.UriSchemeFtp; 
    Uri g = b.Uri; 

    System.Net.FtpWebRequest c = (System.Net.FtpWebRequest)System.Net.FtpWebRequest.Create(g); 
    c.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; 

    System.Net.FtpWebResponse d = (System.Net.FtpWebResponse)c.GetResponse(); 

    System.IO.Stream h = d.GetResponseStream; 
    System.IO.StreamWriter SW = new System.IO.StreamWriter(h); 
    String[] contents = textBox1.Lines.ToArray(); 
    for (int i = 0; i < contents.Length; i++) 
    { 
     SW.WriteLine(contents[i]); 
    } 



    h.Close(); 
    SW.Close(); 

    d.Close(); 
} 

我正的错误是这样的线:

System.IO.StreamWriter SW =新System.IO.StreamWriter(H);

流不可写。

任何想法?

回答

5

从FTP站点响应流数据网站你。你需要请求流...但你不会想要一个方法DownloadFile - 你没有下载,你正在上传,所以你想要的UploadFile方法。

此外:使用using块这样的:

  • 如果引发异常你不关闭任何东西。
  • 在UI线程上这样做网络访问是一个坏主意;当FTP请求发生时,UI线程将会阻塞(所以整个UI将挂起)。改用后台线程。
+0

当我切换到上传文件I得到这一行一个错误: System.IO.Stream H = d.GetResponseStream; 无法将方法组“GetResponseStream”转换为非委托类型“System.IO.Stream”。你打算采用这种方法吗? – David 2010-01-22 16:38:09

+0

我现在得到这行的错误:System.IO.StreamWriter SW = new System.IO.StreamWriter(h);流不可写... – David 2010-01-22 16:45:33

+0

正如我在答案中所说的,你不应该打开响应流 - 你应该打开* request *流。 – 2010-01-22 17:03:42

5

要上传文件,您需要使用FtpWebRequest类。

引用:

当使用的FtpWebRequest目的是 文件上载到服务器,则必须 写的文件的内容通过调用 GetRequestStream方法或其 异步同行获得的请求 流, BeginGetRequestStreamEndGetRequestStream方法。在发送请求之前,您必须先写入 流并关闭 流。

有关上传文件的示例(您可以更改为写入流内容,如示例中所示)see here

+0

我没有选择添加getrequest流 - 它不断抛出我的错误。 – David 2010-01-22 16:58:15

+0

@大卫:“它不断抛出我的错误”不是很精确......你能给出确切的错误信息吗? – 2010-01-22 17:04:21

0

MSDN取出并稍微修改:

public static bool UploadFileOnServer(string fileName, Uri serverUri) 
{ 
    // The URI described by serverUri should use the ftp:// scheme. 
    // It contains the name of the file on the server. 
    // Example: ftp://contoso.com/someFile.txt. 
    // The fileName parameter identifies the file 
    // to be uploaded to the server. 

    if (serverUri.Scheme != Uri.UriSchemeFtp) 
    { 
     return false; 
    } 
    // Get the object used to communicate with the server. 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri); 
    request.Method = WebRequestMethods.Ftp.UploadFile; 

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

    // This example assumes the FTP site uses anonymous logon. 
    request.Credentials = new NetworkCredential ("anonymous","[email protected]"); 
    Stream requestStream = request.GetRequestStream(); 
    requestStream.Write(fileContents, 0, fileContents.Length); 
    requestStream.Close(); 
    FtpWebResponse response = (FtpWebResponse) request.GetResponse(); 

    Console.WriteLine("Upload status: {0}",response.StatusDescription); 

    response.Close(); 
    return true; 
}