使用以下代码将文件下载到服务器时出现问题。
我尝试同时使用.txt文件和.xlsx文件。
该问题仅针对.xlsx文件而不是适用于下载的.txt文件出现。
(要提及。我已经使用FileZilla客户端从服务器手动下载了文件,只是为了查看文件未损坏,但下载后可以正常工作。我可以在excel中打开文件)
当我尝试使用我的代码打开下载的.xlsx文件时,该文件已损坏,excel表示:
此文件已损坏,无法打开
我想知道为什么会这样。 excel文件包含1个图像和文本,我已经尝试了两个具有相同结果的图像:
request.UseBinary = true;
request.UseBinary = false;
代码是:
//Dowwload file
Task<bool> task = FtpDownloadFile("ftp://someurl.com", "ftp://someurl.com/Folder1/r-invoice.xlsx", "C:/Folder1/ToDo Files/r-invoice.xlsx", "user_name", "password");
if (task.IsFaulted == false)
{
}
public async Task<bool> FtpDownloadFile(String host, String webbaddress, String destinationFile, String user_name, String password)
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
bool returnvalue = false;
try
{
var ext = Path.GetExtension(webbaddress);
var imageExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".xlsx" };
var isimage = imageExtensions.Contains(ext);
var request = (FtpWebRequest)WebRequest.Create(webbaddress);
request.Credentials = new NetworkCredential(user_name, password);
request.UseBinary = isimage;
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.ConnectionGroupName = host.Replace(".", "").Replace(":", "").Replace("/", "").Replace("-", "").Replace("_", "") + user_name;
request.ServicePoint.ConnectionLimit = 4;
using (var responseWeb = await request.GetResponseAsync())
{
var response = (FtpWebResponse)responseWeb;
if (response.StatusDescription.Contains("150")) //150 Opening ASCII mode data connection for
{
using (var responseStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(responseStream))
using (StreamWriter destination = new StreamWriter(destinationFile))
{
destination.Write(reader.ReadToEnd());
destination.Flush();
returnvalue = true;
}
}
}
}
}
catch (WebException ex) { String status = ((FtpWebResponse)ex.Response).StatusDescription; MessageBox.Show(status.ToString()); }
return returnvalue;
}
答案 0 :(得分:0)
我尝试将代码的下部更改为以下内容,现在它可以工作了。
using (var responseWeb = await request.GetResponseAsync())
{
var response = (FtpWebResponse)responseWeb;
if (response.StatusDescription.Contains("150")) //150 Opening ASCII mode data connection for
{
using (var responseStream = response.GetResponseStream())
{
using (Stream fileStream = File.Create(destinationFile))
{
responseStream.CopyTo(fileStream);
returnvalue = true;
}
}
}
}