使用ftp上传文件
本文关键字:文件 ftp 使用 | 更新日期: 2023-09-27 18:14:00
我在IIS服务器上使用网站面板。我想用ftp上传一个文件
我使用了以下代码:
try
{
WebClient webClient = new WebClient();
OpenFileDialog fd = new OpenFileDialog();
fd.ShowDialog();
MessageBox.Show(fd.FileName);
webClient.UploadFileTaskAsync(new Uri("ftp://" + "username" + ":" +"pass" +"@" + "address/" + "name.ext"), fd.FileName);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
此代码运行无错误。当我使用网站面板的文件管理器时,一个文件创建了"名称"。但是这个文件的大小是0 KB。为什么?我有什么问题?!
我确信windows防火墙允许我这样做。
更新:我正在做它与UploadFileTask和UploadFile(一个unasync),但结果是相同的async:(
您的异常可能被包含在从WebClient.UploadFileTaskAsync
返回的未等待任务中。你应该在你的任务上await
,这样你的catch
块将检测到一个潜在的异常,因为它将传播到等待的代码行:
public async Task UploadFileByFtpAsync()
{
try
{
WebClient webClient = new WebClient();
OpenFileDialog fd = new OpenFileDialog();
fd.ShowDialog();
MessageBox.Show(fd.FileName);
Task<byte[]> response = await webClient.UploadFileTaskAsync(new Uri("ftp://" + "username" + ":" +"pass" +"@" + "address/" + "name.ext"), fd.FileName);
// You might want to validate the response status code is valid here
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
// Do useful exception handling here
}
}
编辑
正如我在评论中所说的,检查response
变量,它包含您的上传尝试的响应,可能已经失败。
编辑2
似乎问题是与KeepAlive
属性的web/ftp请求。在"底层连接已关闭:服务器违反了协议"中有一个可接受的答案。FTP和here
我的第一个想法是,您没有等待异步调用,因此运行此代码的任何进程或线程可能在UploadFileTaskAsync
调用实际完成之前结束。
尝试将Try块的最后一次调用更改为
await webClient.UploadFileTaskAsync(new Uri("ftp://" + "username" + ":" +"pass" +"@" + "address/" + "name.ext"), fd.FileName);
您可能还想检查调用的返回值:
var result = await webClient.UploadFileTaskAsync(new Uri("ftp://" + "username" + ":" +"pass" +"@" + "address/" + "name.ext"), fd.FileName);
结果对象是服务器响应的byte[]
。
我建议使用本地FtpWebRequest类来上传文件。
try
{
OpenFileDialog fd = new OpenFileDialog();
fd.ShowDialog();
MessageBox.Show(fd.FileName);
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://address/" + fd.FileName);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential("username", "pass");
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = false;
FileStream stream = File.OpenRead(fd.FileName);
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Close();
Stream reqStream = request.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();
}
catch (Exception ex)
{ MessageBox.Show(ex.Message);
}