[OperationContract]
[WebInvoke(
Method = "POST",
UriTemplate = "DownloadFileList",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
void DownloadFileList(Stream stream);
WebInvoke:是标识当前接口是REST,使用POST/GET请求接口。
public class MobileDownloadModel
{
//文件二进制
public byte[] FileStream { get; set; }
//文件字节
public long FileSize { get; set; }
//文件名称
public string FileName { get; set; }
}
这是我自定义了类型
//文件流获取
//参数stream:是参数流,客户端传入过来参数
//fileName:文件地址
public void DownloadFileList(Stream stream)
{
ret = mobileOper.DownloadFileList(new COABSystem_Server.Model.DownFile()
{
FileName = fileName,
});
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AppendHeader("Content-Disposition",
"attachment;filename=" + HttpUtility.UrlEncode(ret.FileName));
HttpContext.Current.Response.AddHeader("Content-Length", ret.FileSize.ToString());
HttpContext.Current.Response.BinaryWrite(ret.FileStream);
HttpContext.Current.Response.End();
HttpContext.Current.Response.Close();
}
通过DownloadFileList方法,内部是实现将文件转化为数据流。
public MobileDownloadModel DownloadFileList(DownFile downFile)
{
MobileDownloadModel ret = new MobileDownloadModel();
try
{
string filePath=downFile.FileName)
string filePath = "D:\\_MyWork\\工经院概与预算管理平台\\开发库\\08.源代码\\Source\\COABS\\Services\\COABSystem_Services\\AttachFileList\\TaskGroupID-22509\\76dede7d-b4d8-4acd-ac3a-aa30af3cbb8f\\D3K38+0.000新建干线_20180719084653.jpg";
if (!File.Exists(filePath))
{
ret.ErrorCode = -1;
ret.ErrorMsg = "未找到文件地址";
return ret;
}
//根据文件路径获取文件名称
string fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(downFile.FileName);
//读取文件,转为文件流
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
//将文件转为二进制,
long fileSize = fileStream.Length;
byte[] bytes = new byte[fileSize];
fileStream.Read(bytes, 0, bytes.Length);
fileStream.Close();
ret.ErrorCode = 0;
ret.FileStream = bytes;
ret.FileSize = fileSize;
ret.FileName = fileNameWithoutExtension;
fileStream.Close();
}
}
catch (Exception e)
{
ret.ErrorCode = -1;
ret.ErrorMsg = e.Message;
}
return ret;
}
以上是请求文件下载.下面是我测试文件下载。
static void Main(string[] args)
{
//文件地址:这是url加密后,传输时会被乱码。
var postDataStr = "FileName=D%253A%255C%25E5%25B7%25A5%25E7%25BB%258F%25E9%2599%25A2%25E9%25A1%25B9%25E7%259B%25AE%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8%255CPublishDir%2528%25E5%2588%2586%25E5%25BA%2593%25E5%258F%2591%25E5%25B8%2583%25E7%259B%25AE%25E5%25BD%2595%2529%255CAttachFileList%255CTaskGroupID-22509%255C90935f59-fbce-4abe-89a2-6985ba120722%255C%25E7%25A7%25BB%25E5%258A%25A8DK0%252B0.000%25E7%25A0%2582%25E5%259C%25BA_20180719083933.jpg";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://10.20.116.36:19764/MobileService.svc/DownloadFileList");
request.Method = "POST";
request.Timeout = 6000000;
request.ContentType = "application/octet-stream; charset=utf-8";
StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.UTF8);
writer.Write(postDataStr);
writer.Flush();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
//文件需要保存的地址
string path = @"D:\_MyWork\工经院概与预算管理平台\开发库\08.源代码\Source\COABS\Services\COABSystem_Services\AttachFileList\TaskGroupID-22509\76dede7d-b4d8-4acd-ac3a-aa30af3cbb8f\1.jpg";
//创建本地文件写入流
Stream stream = new FileStream(path, FileMode.Create);
byte[] bArr = new byte[1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
stream.Close();
responseStream.Close();
}
catch (Exception ex)
{
}
}
理论我不怎么懂,但是大概意思就是这样!
参考信息:https://blog.csdn.net/wangziyi5110/article/details/43052777