【发布时间】:2014-11-30 08:07:34
【问题描述】:
这是方法:
在这种情况下,我还使用 f.TargetFolder,f.TargetFolder 包含:ftpmytestdir
而变量UploadPath包含:
ftp.newsxpressmedia.com/ftpmytestdir/clean_radar_image.png
然后它将执行此行:
UploadPath = "ftp://" + UploadPath;
之后 UploadPath 将是:
ftp://ftp.newsxpressmedia.com/ftpmytestdir/clean_radar_image.png
文件是字符串[] 类型 例如在 txf 我有 test.png
我看到了文件大小和所有内容,直到 Stream 没有例外。
我使用了一个断点并移动到第 78 行:
using (Stream requestStream = request.GetRequestStream())
在这一行它跳转到了捕获区域并显示了异常。
private void StringArrayUploadFiles(object sender, DoWorkEventArgs e)
{
try
{
foreach (string txf in files)
{
string fn = txf;
BackgroundWorker bw = sender as BackgroundWorker;
f = e.Argument as FtpSettings;
string UploadPath = String.Format("{0}/{1}{2}", f.Host, f.TargetFolder == "" ? "" : f.TargetFolder + "/", Path.GetFileName(fn));
if (!UploadPath.ToLower().StartsWith("ftp://"))
UploadPath = "ftp://" + UploadPath;
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(UploadPath);
request.UseBinary = true;
request.UsePassive = f.Passive;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Timeout = 300000;
request.Credentials = new NetworkCredential(f.Username, f.Password);
long FileSize = new FileInfo(fn).Length;).Length;
string FileSizeDescription = GetFileSize(FileSize);
int ChunkSize = 4096, NumRetries = 0, MaxRetries = 50;
long SentBytes = 0;
byte[] Buffer = new byte[ChunkSize];
using (Stream requestStream = request.GetRequestStream())
{
using (FileStream fs = File.Open(fn, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
int BytesRead = fs.Read(Buffer, 0, ChunkSize);
while (BytesRead > 0)
{
try
{
if (bw.CancellationPending)
return;
requestStream.Write(Buffer, 0, BytesRead);
SentBytes += BytesRead;
string SummaryText = String.Format("Transferred {0} / {1}", GetFileSize(SentBytes), FileSizeDescription);
bw.ReportProgress((int)(((decimal)SentBytes / (decimal)FileSize) * 100), SummaryText);
}
catch (Exception ex)
{
Debug.WriteLine("Exception: " + ex.ToString());
if (NumRetries++ < MaxRetries)
{
fs.Position -= BytesRead;
}
else
{
throw new Exception(String.Format("Error occurred during upload, too many retries. \n{0}", ex.ToString()));
}
}
BytesRead = fs.Read(Buffer, 0, ChunkSize);
}
}
}
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
System.Diagnostics.Debug.WriteLine(String.Format("Upload File Complete, status {0}", response.StatusDescription));
}
}
catch (WebException ex)
{
switch (ex.Status)
{
case WebExceptionStatus.NameResolutionFailure:
ConnectionError = "Error: Please check the ftp address";
break;
case WebExceptionStatus.Timeout:
ConnectionError = "Error: Timout Request";
break;
}
}
}
这是异常消息:远程服务器返回错误:(550) 文件不可用(例如,找不到文件,无法访问)。
System.Net.WebException was caught
HResult=-2146233079
Message=The remote server returned an error: (550) File unavailable (e.g., file not found, no access).
Source=System
StackTrace:
at System.Net.FtpWebRequest.CheckError()
at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
at System.IO.Stream.Close()
at System.Net.ConnectionPool.Destroy(PooledStream pooledStream)
at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse)
at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
at System.Net.FtpWebRequest.GetRequestStream()
at FTP_ProgressBar.FtpProgress.StringArrayUploadFiles(Object sender, DoWorkEventArgs e) in c:\ftp_progressbar\FTP_ProgressBar\FtpProgress.cs:line 78
InnerException:
【问题讨论】:
-
我发现了问题,但不知道如何解决。你发现如果 f.TargetFolder 包含一个目录来将文件上传到 ftp 上,例如 myftptestdir 那么它会抛出异常。但是如果 f.TargetFolder 是空的,那么它会很好地上传文件,但它们会被上传到 ftp 的根目录。问题是当 f.TargetFolder 里面有目录时如何解决这个问题。
-
我尝试在方法中添加以下行:request.Method = WebRequestMethods.Ftp.MakeDirectory;但仍然在线使用(Stream....我遇到了异常。不知道为什么。
-
而且我可以在我的 ftp 服务器上手动创建目录,所以这不是访问权限或其他问题的问题。