2012-02-01 34 views
5

Tôi đang xuất bản URL trang ví dụ: mysite.com/disclaimer/someinfo trang này hiển thị thỏa thuận và nếu người dùng nhấp vào nút đồng ý thì tệp PDF sẽ được phát dưới dạng tệp đính kèm .Response.WriteFile & Response.Redirect

Mục đích của việc này là người dùng có thể chia sẻ URL này nhưng bất kỳ ai khác theo liên kết cũng phải đọc thỏa thuận trước khi tải xuống tệp. Các tập tin thực tế không có một URL nhưng được tổ chức ở nơi khác trên máy chủ vì vậy cách duy nhất để tải tập tin là nếu bạn nhấp vào nút "[Đồng ý]".

Tuy nhiên - những gì tôi thấy khó khăn là sau khi nhấp vào nút và bắt đầu tải xuống, tôi muốn trang "biến mất". Trang có các nút nằm trên màn hình. Lý tưởng nhất là họ sẽ được chuyển hướng trở lại trang họ đến. Tôi rất muốn không yêu cầu javascript hoặc cookie. Liên kết giới thiệu được lưu trữ trong tải trang ban đầu cho một trường ẩn trên biểu mẫu.

Tôi đã thử các cách tiếp cận khác nhau, cố gắng viết chuyển hướng 307 trong tiêu đề với tệp đã đưa ra cảnh báo cho người dùng rằng dữ liệu bài đăng của họ đã được chuyển hướng. Mã tôi có dưới đây chỉ hoạt động trong các trình duyệt hỗ trợ làm mới meta (ví dụ: Firefox; IE7 không phải Chrome/Safari)

Tôi có thể thấy lý do tại sao điều này không hiệu quả. Có một câu trả lời cho trình duyệt và đó là tệp như mong đợi. Điều gì sẽ là cách chính xác để gửi cho họ các tập tin và sau đó chuyển hướng trình duyệt đến một trang khác. Nó cảm thấy từ một người dùng p.o.v. rằng trang "Chấp nhận" này sẽ biến mất khi họ đã nhấp vào nút.

tôi có:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request.UrlReferrer != null & Request.UrlReferrer.ToString() != "") 
     { 
      Uri referrer = Request.UrlReferrer; 
      if (!IsPostBack) 
      { hfReferrer.Value = Request.UrlReferrer.ToString(); } 
     } 
    } 

    protected void buttonAccept_Click(object sender, EventArgs e) 
    { 
     //stream file 
     Node nodeCurrent = Node.GetCurrent(); 
     string fileName = nodeCurrent.GetProperty("documentFile").Value.ToString(); 
     System.IO.FileInfo file = new System.IO.FileInfo(fileName); 
     if (file.Exists) //set appropriate headers 
     { 
      Response.Clear(); 

      if (hfReferrer.Value !="") 
      {Response.AddHeader("Refresh", string.Format("3; URL={0}", hfReferrer.Value));} 

      Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
      Response.AddHeader("Content-Length", file.Length.ToString()); 
      Response.ContentType = "application/pdf"; 

      // write file to browser 
      Response.WriteFile(file.FullName); 
      Response.End(); 
     } 

Tôi không muốn cần phải sử dụng javascript/pop-up, vv Hiện nay người dùng chỉ cần phải bấm vào một liên kết đến một trang khác, nhưng điều này doesn' Tôi cảm thấy khá đúng.

Lý tưởng nhất là tôi muốn tuân theo một tiêu chuẩn tốt cho việc này. Nhưng tôi không chắc chắn nơi để tìm.

Trả lời

2

Tôi khuyên bạn nên thử một hành vi hơi khác. Trên trình xử lý sự kiện buttonAccept_Click, chuyển hướng người dùng đến trang cảm ơn. Trong trang Page_Load của trang cảm ơn này có mã để tải xuống tệp. Điều này rất dễ thực hiện và mang lại trải nghiệm tốt hơn cho người dùng.

+0

Chỉ cần đảm bảo bạn xác thực liên kết giới thiệu đến trang đó là trang biểu mẫu để người dùng không thể sao chép URL đó và truy cập trực tiếp vào tệp trên mỗi lần tải trang. – CoderMarkus

Các vấn đề liên quan