【发布时间】:2015-02-23 09:42:54
【问题描述】:
首先这是我硬盘上的原始文件名:שקל100.jpg שקל 是希伯来语中的一个词 当我将文件上传到我的 ftp 时,上传没有问题,但 ftp 服务器上的文件名如下所示:
ftp 服务器上的文件看起来像 gibrish 而不是希伯来语。 问题是当我尝试下载文件时。文件名是100???.jpg 而且 FtpWebrequest 不知道什么是 100???.jpg
reqFTP = (FtpWebRequest)FtpWebRequest.Create(fileurl);
在 fileurl 我看到:ftp://ftp.newsxpressmedia.com/D/100???.jpg
问题是在这种情况下我能做什么?也许强制将文件名重命名为一些默认的临时文件名?
我猜问题是 ftp 服务器 ipage.com 主机不知道阅读希伯来语所以上传后它看起来像乱码。
或者我可能需要以某种方式上传它并使用希伯来语对文件名进行编码? 这是我用来上传文件的方法:
private void StringArrayUploadFiles(object sender, DoWorkEventArgs e)
{
try
{
UploadedFiles = files;
foreach (string fn in files)
{
BackgroundWorker bw = sender as BackgroundWorker;
f = e.Argument as FtpSettings;
MakeDir(f.TargetFolder);
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;//f.SourceFile).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;
}
}
}
我现在做了一个测试,试图上传一个文件名中带有希伯来语的文件。 在变量文件中,我看到带有希伯来字母的文件很好。 并且上传的文件没有任何异常或问题。
这是文件在再次使用 gibrish 上传后在 ftp 服务器上的样子:
遇到这种情况我该怎么办?在上传方法中进行上传之前的编码应该解决吗?如果是这样,我该如何进行编码?
【问题讨论】:
-
您的 FTP 服务器和操作系统是否支持 unicode 名称?
-
Dark my os 是的,我不确定我的 ftp 服务器。
标签: c# .net winforms file-upload ftp