考慮可以使用jquery ajax提交form請求的方式。
jquery download函數:
代碼如下 |
複製代碼 |
// Ajax 檔案下載 jQuery.download = function (url, data, method) { // 擷取url和data if (url && data) { // data 是 string 或者 array/object data = typeof data == 'string' ? data : jQuery.param(data); // 把參數組裝成 form的 input var inputs = ''; jQuery.each(data.split('&'), function () { var pair = this.split('='); inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />'; }); // request發送請求 jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>') .appendTo('body').submit().remove(); }; }; |
用jquery的方式組織一個字串,類比提交一個form請求。
也就是動態渲染表單,提交表單後再刪除。
html的圖片代碼:
代碼如下 |
複製代碼 |
<img onclick="GetSrcFromSvc('" + name + "')" src="" + imgurl + "" //> GetSrcFromSvc函數實現調用: $.download("http://localhost:2204/wx/Default.aspx", "img=" + url, 'post'); |
asp.net伺服器端代碼:aspx檔案:
微軟為Response對象提供了一個新的方法TransmitFile來解決使用Response.BinaryWrite下載超過
400mb的檔案時導致Aspnet_wp.exe進程回收而無法成功下載的問題。 ///指定被輸出映像的地址
代碼如下 |
複製代碼 |
string imgurl = Request.Form["img"]; string FileName = Server.MapPath(imgurl); // System.Drawing.Image img = System.Drawing.Image.FromFile(imgurl); // MemoryStream ms = new System.IO.MemoryStream(); // img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); // img.Dispose(); // context.Response.ClearContent(); // context.Response.ContentType = "image/jpg"; // context.Response.BinaryWrite(ms.ToArray()); // //context.htm = htm&File(FileName); // ////??uffer 中的stream全部送出 // context.Response.Flush(); //// context.Response.End(); string filePath = Server.MapPath(imgurl);//路徑 if (File.Exists(filePath)) { FileInfo fileinfoo = new FileInfo(filePath); Response.ContentType = "application/x-zip-compressed"; Response.AddHeader("Content-Disposition", "attachment;filename=" + fileinfoo.Name + ""); Response.TransmitFile(filePath); } else { htm = htm&("未找到檔案。"); } |
asp.net 流方式下載:
代碼如下 |
複製代碼 |
string imgurl = Request.Form["img"]; string FileName = Server.MapPath(imgurl); if (File.Exists(FileName)) { FileInfo fileinfoo = new FileInfo(FileName); //以字元流的形式下載檔案 FileStream fs = new FileStream(FileName, FileMode.Open); byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length); fs.Close(); Response.ContentType = "application/octet-stream"; //通知瀏覽器下載檔案而不是開啟 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileinfoo.Name, System.Text.Encoding.UTF8)); Response.BinaryWrite(bytes); Response.Flush(); Response.End(); } |
測試環境:
win7+IE9 IE10 。手機端:uc。
其他瀏覽器無法預計效果。