1. 程式人生 > >webapi 下載Ftp檔案並返回流到瀏覽器完成檔案下載

webapi 下載Ftp檔案並返回流到瀏覽器完成檔案下載

ResultModel<HttpResponseMessage> resultModel = new ResultModel<HttpResponseMessage>(ResultStatus.Success);
FtpWebResponse ftpWebResponse = null;
Stream ftpStream = null;
try
{
if (dt != null && dt.Rows.Count > 0)
{
string content = dt.Rows[0]["Content"].ToString();
FileSourceDto fileSourceDto = Newtonsoft.Json.JsonConvert.DeserializeObject<FileSourceDto>(content);
string path = fileSourceDto.TargetInfo.FileUrl.TrimEnd('\\').TrimEnd('/') + "/" + fileSourceDto.TargetInfo.FileName;
string account = fileSourceDto.TargetInfo.UserName;
string pwd = fileSourceDto.TargetInfo.Password;
if (!string.IsNullOrEmpty(path) && !string.IsNullOrEmpty(account) && !string.IsNullOrEmpty(pwd))
{
FtpWebRequest reqFTP;

// 根據uri建立FtpWebRequest物件
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));

// 指定資料傳輸型別
reqFTP.UseBinary = true;

// ftp使用者名稱和密碼
reqFTP.Credentials = new NetworkCredential(account, pwd);
ftpWebResponse = (FtpWebResponse)reqFTP.GetResponse();
}

ftpStream = ftpWebResponse.GetResponseStream();
byte[] bytes = null;
using (StreamReader sr = new StreamReader(ftpStream))
{
string fileContent = sr.ReadToEnd();
bytes = Encoding.UTF8.GetBytes(fileContent);
}
ftpStream = new MemoryStream(bytes);
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(ftpStream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileSourceDto.TargetInfo.FileName
};

resultModel.Data = response;
}
}
catch (Exception ex)
{
resultModel = new ResultModel<HttpResponseMessage>(ResultStatus.Fail, "JD_DataShare_ESB_Error[獲取檔案流]:" + ex.Message);
}
finally
{
if (ftpWebResponse != null)
{
ftpWebResponse.Close();
}
}

return resultModel;