WCF POST 请求文件下载

1 篇文章 0 订阅
        [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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值