ASP.NET 무 리 셋 다운 로드 를 실현 하고 다운로드 가 완 료 된 개발 방향 을 제시 합 니 다.

먼저 코드 를 붙 여 드 리 겠 습 니 다.뒤에 구체 적 인 문자 설명 을 해 드 리 겠 습 니 다.
다음은 전단 코드:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <script src="Scripts/jquery-1.8.2.js"></script>
  <script type="text/javascript">
    $(function () {
      $("#btnDownLoad").on("click", function () {
        var $loading = $("#loadingbox");
        var downId = new Date().getTime() + "-" + Math.random();
        $loading.css("display", "block");
        DownLoad($("#downfile").val(), downId);
        var tid=setInterval(function () {
          $.post("WebForm2.aspx", { getresult: "Y", downid: downId }, function (result) {
            //document.writeln("result:" + result);
            if(result=="Y")
            {
              clearInterval(tid);
              $loading.css("display", "none");
              alert("    !");
            }
          });
        }, 3000);
      });
      function DownLoad(filename,downid) {
        var $form = $("<form target='' method='post' action='WebForm2.aspx'></form>");
        $form.append("<input type='hidden' name='filename' value='" + filename + "'>");
        $form.append("<input type='hidden' name='downid' value='" + downid + "'>");
        $('body').append($form);
        $form.submit();
      }
    });
  </script>
</head>
<body>
    다운로드 할 파일 이름:

 <input type="button" id="btnDownLoad" value="       " />
  <div id="loadingbox" style="display:none;">
         ,   。。。
  </div>
</body>
</html>
다음은 서버 쪽 코드 입 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
namespace WebApplication1
{
  public partial class WebForm2 : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      if (Request.HttpMethod == "POST")
      {
        string getresult = Request.Form["getresult"];
        string downId=Request.Form["downid"];
        string cacheKey =string.Format("downloadcompleted-{0}-{1}",downId,Request.UserHostAddress);
        if (getresult == "Y") //              
        {
          string result = (Cache[cacheKey] ?? "N").ToString();
          Response.Clear();
          Response.Write(result);
          if(result=="Y") //         ,           CACHE
          {
            Cache.Remove(cacheKey);
          }
          Response.End();
          return;
        }
        string fileName = Request.Form["filename"];
        string localFilePath = Server.MapPath("~/" + fileName);
        System.IO.FileInfo file = new System.IO.FileInfo(localFilePath);
        Response.Clear();
        Response.ClearHeaders();
        Response.Buffer = false;
        Response.AddHeader("Content-Disposition", "attachment;filename=" + file.Name);
        Response.AddHeader("Content-Length", file.Length.ToString());
        Response.ContentType = "application/octet-stream";
        Response.WriteFile(file.FullName);
        Response.Flush();
        Cache.Insert(cacheKey, "Y");//         ,  CACHE,   downloadcompleted=Y,         
        Response.End();
      }
    }
  }
}
구현 원리:프론트 엔 드 는 동적 으로 FORM 을 생 성하 여 다운 로드 를 요청 하 는 자원 입 니 다.요청 매개 변수 에는 downId(다운로드 할 파일 이름 도 포함 되 어 있 습 니 다)가 포함 되 어 있어 야 합 니 다.이것 은 서버 엔 드 의 cache Key 에 대응 하 는 것 입 니 다.서버 엔 드 에서 다운로드 요청 을 받 으 면 다운로드 할 파일 이름과 downId 를 가 져 옵 니 다.그 다음 에 downId 에 따라 해당 하 는 cache Key 를 생 성하 여 다운로드 결 과 를 표시 한 다음 에 다운로드 파일 이름 에 따라 서버 의 파일 자원 을 가 져 오고 출력 파일 흐름 에 응답 하여 클 라 이언 트 가 다운로드 할 수 있 도록 합 니 다.출력 이 끝 난 후에 Cache 를 생 성하 고 Y 로 표시 하여 출력 이 완료 되 었 음 을 나타 냅 니 다.클 라 이언 트 는 파일 을 다운로드 하 는 동시에 3 초 마다 서버 에 다운로드 가 완 료 된 Cache 표 지 를 가 져 오 라 고 요청 합 니 다.그 값 이 Y 이면 다운로드 가 완 료 된 것 을 표시 합 니 다.서버 는 이 Cache 를 즉시 제거 하고 클 라 이언 트 는 해당 하 는 응답 을 합 니 다(예 를 들 어 다운로드 알림 대화 상자 와 팝 업 다운로드 가 완 료 된 대화 상 자 를 닫 습 니 다)
효 과 는 다음 과 같 습 니 다:
 
여러 개의 서로 다른 브 라 우 저 와 큰 파일 압력 테스트 를 통 해 호환성 이 좋 고 정상적으로 다운로드 할 수 있 으 며 다운로드 완료 알림 을 받 을 수 있 습 니 다.상기 원 리 를 바탕 으로 진도 표시 를 실현 할 수 있 습 니 다.원 리 를 약술 할 수 있 습 니 다.클 라 이언 트 가 서버 에 자원 을 다운로드 하 라 고 요청 하고 서버 응답 에 따라 바이트 별로 순서대로 출력 합 니 다.출력 할 때마다 CACHE 를 생 성하 고 출력 진 도 를 저장 합 니 다.모든 출력 이 끝 날 때 까지 클 라 이언 트 는 서버 에 자원 다운 로드 를 요청 하 는 동시에 몇 초 마다 서버 다운로드 진 도 를 조회 하고 다운로드 진도 가 100%정지 될 때 까지 요청 해 야 합 니 다.HTML 5 의 새로운 특성 인 WEBSOCKET 기술 을 이용 하여 도 가능 하 다.

좋은 웹페이지 즐겨찾기