Tôi đã tìm thấy vấn đề này quá cố gắng tải xuống các loại tệp khác nhau (png, pdf, xlsx, docx, v.v ...) từ máy chủ REST DataSnap (Delphi XE3) thành ứng dụng web JavaScript. Một số trình duyệt (ví dụ: FireFox) sẽ thực hiện hành động đúng, nhưng không phải tất cả. Internet Explorer không nhận ra hành động thích hợp cho tệp được tải xuống mà không có loại nội dung chính xác. Giải pháp @Anders ban đầu có vẻ phù hợp với tôi vì tôi đã làm việc với PDF và Firefox. Nhưng khi tôi đã thử nghiệm trên IE (và những người khác) và với các phần mở rộng khác nhau, các tập tin mà không được công nhận. Sử dụng Firebug I have seen that Content-Type luôn "text/html" và không phải là một giao sử dụng
GetInvocationMetadata.ResponseContentType := '...my assigned content type ...';
Cách giải quyết tìm thấy làm việc đối với tôi là:
Trong ServerMethodsUnit
var
ContentTypeHeaderToUse: string; // Global variable
TServerMethods1.GetFile(params: JSON):TStream;
begin
.... processing ....
ContentTypeHeaderToUse := '...' (assign correct content type).
end;
Trong WebModuleUnit
procedure TWebModule1.WebModuleAfterDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
if ContentTypeHeaderToUse<>'' then begin
Response.ContentType := ContentTypeHeaderToUse;
ContentTypeHeaderToUse := ''; // Reset global variable
end;
end;
Tôi đã sử dụng giải pháp tương tự để gán Nội dung Bố trí quá. Đây là khóa tiêu đề hữu ích để đặt tên tệp để tải xuống và tệp đính kèm/chế độ nội tuyến. Với mã này là:
procedure TWebModule1.WebModuleAfterDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
if ContentDispositionHeaderToUse<>'' then begin
Response.SetCustomHeader('content-disposition',ContentDispositionHeaderToUse);
ContentDispositionHeaderToUse := '';
end;
if ContentTypeHeaderToUse<>'' then begin
Response.ContentType := ContentTypeHeaderToUse;
ContentTypeHeaderToUse := '';
end;
end;
Gán ContentDispositionHeaderĐể sử dụng phương thức triển khai máy chủ.
EDIT
workaround này không hoạt động trong ISAPI DLL trên IIS với kích hoạt nén dữ liệu! Với không compressione dữ liệu (địa phương debuggin IIS) tiêu đề phản ứng là:
Connection close
Content-Disposition inline; filename="Privacy-0.rtf.pdf"
Content-Length 150205
Content-Type application/pdf; charset=ISO-8859-1
Pragma dssession=28177.371935.39223,dssessionexpires=1200000
nhưng với sản xuất được kích hoạt IIS phản ứng đi kèm với:
Content-Encoding gzip
Content-Length 11663
Content-Type text/html
Date Thu, 11 Sep 2014 21:56:43 GMT
Pragma dssession=682384.52215.879906,dssessionexpires=1200000
Server Microsoft-IIS/7.5
Vary Accept-Encoding
X-Powered-By ASP.NET
Content-disposition và loại nội dung được phân công trong mã DataSnap không nổi lên.