Tài liệu này giải thích cách mở tệp Microsoft Excel trong trình duyệt mà không hiển thị hộp thoại Mở-Lưu-Hủy
Cần lưu ý ở đây rằng hạn chế bảo mật không cho phép tải xuống tệp trực tiếp được thực thi bởi Microsoft [hoặc các nhà cung cấp trình duyệt khác], không phải bởi Aspose. Nó được áp dụng để chặn và hạn chế các tệp có khả năng gây hại được tải xuống máy cục bộ
Sẽ rất nguy hiểm nếu hệ thống cục bộ của khách hàng cho phép tải xuống mà không hiển thị hộp thoại Mở-Lưu-Hủy để nhắc tải xuống. Không có tùy chọn hoặc cách giải quyết nào có sẵn từ Aspose vì đây sẽ là một rủi ro bảo mật rất lớn
Tại sao lại là rủi ro bảo mật?
Hình ảnh sau đây hiển thị hộp thoại Mở-Lưu-Hủy do Internet Explorer hiển thị khi cố tải xuống một tệp
Hộp thoại Mở-Lưu-HủyMở tệp mà không có hộp thoại Mở-Lưu-Hủy
Mặc dù đây là một vấn đề bảo mật lớn, nhưng Microsoft vẫn cung cấp các cài đặt Internet Explorer cho phép người dùng tắt lời nhắc Mở-Lưu-Hủy để tải xuống tệp
Khi tải xuống tệp, trong khay tải xuống ở phía dưới, tệp sẽ hiển thị để hiển thị tiến trình của nó. nhấp vào mũi tên lên "^"Mở "My Computer" và chọn "Folder Options" trong menu "View". Chọn tab "Loại tệp" và tìm biểu tượng có nội dung Bảng tính Microsoft Excel trong Loại tệp đã đăng ký. Chọn hộp trong cửa sổ mới có nội dung "Xác nhận mở sau khi tải xuống". Nhấp vào OK
Thông tin này có hữu ích không?
Chào mọi người,Người đã đặt câu hỏi ban đầu [bayus. firestorm] đã đánh dấu chủ đề này là đã được giải quyết và những người khác dường như đang sử dụng chủ đề này để khiếu nại và thảo luận riêng, vì vậy tôi sẽ khóa chủ đề này. Hãy yên tâm rằng chúng tôi đã chuyển phản hồi của bạn cho nhóm Firefox. Họ đã hỏi về những gì người dùng ở đây đã nói và chúng tôi đã đưa vào nhận xét của bạn. Khi mở tệp từ bất kỳ trình duyệt nào, tệp sẽ được tải xuống thư mục "''TEMP''" của Windows. Nhiều người không thể tìm thấy tệp mà họ đã mở hoặc xóa chúng. Thay đổi này làm cho việc tải xuống thư mục Tải xuống trở thành hành vi mặc định. Nếu chọn, bạn có thể khiến Firefox hỏi phải làm gì với các loại tệp cụ thể. Đây là cách làm cho nó hỏi. 1. Nhấp vào biểu tượng '''Downloads''' trên thanh công cụ [nó sẽ tự động mở khi bạn tải xuống tệp]. 2. Nhấp chuột phải vào tệp và bật '''Luôn mở các tệp tương tự''' 3. Vào '''Cài đặt''', và cuộn xuống phần ''Ứng dụng'' 4. Bên cạnh loại tệp, nhấp vào cột Hành động và đặt thành '''Luôn hỏi''' Bạn vẫn cần xóa tệp theo cách thủ công.
Đây là cách Chrome xử lý tải xuống tệp. Google đã quyết định rằng thay vì cho phép các ứng dụng tự động mở các tệp được tải xuống qua Chrome, các tệp phải được tải xuống máy cục bộ của bạn. Thật không may, không có cách giải quyết cho việc này. Nếu bạn muốn tự động mở các tệp từ Sharepoint để làm việc và lưu vào SP trong trình duyệt, bạn sẽ cần sử dụng một trình duyệt khác như IE hoặc Firefox
Tuy nhiên, nếu bạn chỉ muốn file tải về và tự động mở ứng dụng, hãy xem câu trả lời của Tekla. Sau khi tải xuống, bạn sẽ nhấp vào mũi tên lên/dấu mũ [^] bên cạnh phần tải xuống trên thanh trạng thái và chọn "Luôn mở các tệp thuộc loại này". Điều này sẽ khiến Chrome chuyển quá trình tải xuống sang ứng dụng được liên kết
Từ mô tả của bạn. bạn muốn mở trực tiếp excel của mình trong trình duyệt web. thay vì Ứng dụng Excel
Theo như tôi biết, không thể đạt được điều đó bằng mã trên máy chủ bằng bất kỳ thứ gì sử dụng ActiveX hoặc Phản hồi, nhưng bạn có thể thử đạt được điều đó bằng cách triển khai ở phía Máy khách [chọn bất kỳ thư mục nào trong PC khách -> Công cụ -> Tùy chọn thư mục - . Vì vậy, bạn có thể chọn thay thế như sau
Bạn không thể trực tiếp trả lại tệp để tải xuống qua lệnh gọi AJAX, vì vậy, một cách tiếp cận khác là sử dụng lệnh gọi AJAX để đăng dữ liệu liên quan lên máy chủ của bạn. Sau đó, bạn có thể sử dụng mã phía máy chủ để tạo Tệp Excel [Tôi khuyên bạn nên sử dụng EPPlus hoặc NPOI cho việc này mặc dù có vẻ như phần này của bạn đang hoạt động]
CẬP NHẬT tháng 9 năm 2016
Câu trả lời ban đầu của tôi [bên dưới] đã hơn 3 năm tuổi, vì vậy tôi nghĩ rằng tôi sẽ cập nhật vì tôi không còn tạo tệp trên máy chủ khi tải xuống tệp qua AJAX, tuy nhiên, tôi đã để lại câu trả lời ban đầu vì nó vẫn có thể được sử dụng tùy thuộc vào
Một kịch bản phổ biến trong các ứng dụng MVC của tôi là báo cáo qua một trang web có một số tham số báo cáo do người dùng định cấu hình [Phạm vi ngày, Bộ lọc, v.v. ]. Khi người dùng đã chỉ định các tham số mà họ đăng chúng lên máy chủ, báo cáo sẽ được tạo [ví dụ: một tệp Excel làm đầu ra] và sau đó tôi lưu trữ tệp kết quả dưới dạng một mảng byte trong nhóm TempData
với một tham chiếu duy nhất. Tham chiếu này được trả lại dưới dạng Kết quả Json cho chức năng AJAX của tôi, chức năng này sau đó sẽ chuyển hướng đến hành động của bộ điều khiển riêng biệt để trích xuất dữ liệu từ TempData
và tải xuống trình duyệt của người dùng cuối
Để cung cấp thêm chi tiết này, giả sử bạn có Chế độ xem MVC có biểu mẫu được liên kết với lớp Mô hình, hãy gọi Mô hình ReportVM
Đầu tiên, cần có một hành động của bộ điều khiển để nhận mô hình đã đăng, một ví dụ sẽ là
public ActionResult PostReportPartial[ReportVM model]{
// Validate the Model is correct and contains valid data
// Generate your report output based on the model parameters
// This can be an Excel, PDF, Word file - whatever you need.
// As an example lets assume we've generated an EPPlus ExcelPackage
ExcelPackage workbook = new ExcelPackage[];
// Do something to populate your workbook
// Generate a new unique identifier against which the file can be stored
string handle = Guid.NewGuid[].ToString[];
using[MemoryStream memoryStream = new MemoryStream[]]{
workbook.SaveAs[memoryStream];
memoryStream.Position = 0;
TempData[handle] = memoryStream.ToArray[];
}
// Note we are returning a filename as well as the handle
return new JsonResult[] {
Data = new { FileGuid = handle, FileName = "TestReportOutput.xlsx" }
};
}
Cuộc gọi AJAX đăng biểu mẫu MVC của tôi lên bộ điều khiển ở trên và nhận được phản hồi giống như thế này
$ajax[{
cache: false,
url: '/Report/PostReportPartial',
data: _form.serialize[],
success: function [data]{
var response = JSON.parse[data];
window.location = '/Report/Download?fileGuid=' + response.FileGuid
+ '&filename=' + response.FileName;
}
}]
Hành động của bộ điều khiển để xử lý việc tải xuống tệp
[HttpGet]
public virtual ActionResult Download[string fileGuid, string fileName]
{
if[TempData[fileGuid] != null]{
byte[] data = TempData[fileGuid] as byte[];
return File[data, "application/vnd.ms-excel", fileName];
}
else{
// Problem - Log the error, generate a blank file,
// redirect to another controller action - whatever fits with your application
return new EmptyResult[];
}
}
Một thay đổi khác có thể dễ dàng được cung cấp nếu được yêu cầu là chuyển Loại MIME của tệp dưới dạng tham số thứ ba để một hành động của Bộ điều khiển có thể phục vụ chính xác nhiều định dạng tệp đầu ra
Điều này loại bỏ mọi nhu cầu đối với bất kỳ tệp vật lý nào được tạo và lưu trữ trên máy chủ, do đó không cần phải thực hiện các quy trình quản lý và một lần nữa, điều này là liền mạch với người dùng cuối
Lưu ý, lợi thế của việc sử dụng TempData
thay vì Session
là khi đọc xong TempData
, dữ liệu sẽ bị xóa nên sẽ hiệu quả hơn về mặt sử dụng bộ nhớ nếu bạn có số lượng lớn yêu cầu tệp. Xem TempData Thực hành tốt nhất
Câu trả lời GỐC
Bạn không thể trực tiếp trả lại tệp để tải xuống qua lệnh gọi AJAX, vì vậy, một cách tiếp cận khác là sử dụng lệnh gọi AJAX để đăng dữ liệu liên quan lên máy chủ của bạn. Sau đó, bạn có thể sử dụng mã phía máy chủ để tạo Tệp Excel [Tôi khuyên bạn nên sử dụng EPPlus hoặc NPOI cho việc này mặc dù có vẻ như phần này của bạn đang hoạt động]
Khi tệp đã được tạo trên máy chủ, hãy trả lại đường dẫn tới tệp [hoặc chỉ tên tệp] làm giá trị trả về cho lệnh gọi AJAX của bạn, sau đó đặt JavaScript
$ajax[{
cache: false,
url: '/Report/PostReportPartial',
data: _form.serialize[],
success: function [data]{
var response = JSON.parse[data];
window.location = '/Report/Download?fileGuid=' + response.FileGuid
+ '&filename=' + response.FileName;
}
}]
1 thành URL này sẽ nhắc trình duyệt tải xuống tệpTừ góc độ người dùng cuối, thao tác tải xuống tệp diễn ra liền mạch vì họ không bao giờ rời khỏi trang bắt đầu yêu cầu