2012-12-14 17 views
7

में एक डेल्फी बाकी सर्वर से एक छवि लौटें और यह दिखाने जब आप एक डेल्फी बाकी सर्वर में एक फ़ाइल धारा वस्तु का उपयोग कर एक छवि लौटने के लिए, यह एक ब्राउज़र में प्रदर्शित नहीं होगी।एक ब्राउज़र

function TServerClass.Image: TFileStream; 
begin 
    Result := TFileStream.Create('pathtofile\image.png', fmOpenRead or fmShareDenyNone); 
end; 

उत्तर

17

समस्या यह है कि डेल्फी बाकी सर्वर हमेशा पाठ में/HTML सामग्री प्रकार सेट है: यहाँ एक उदाहरण विधि है कि एक छवि रिटर्न है। जब आप अन्य प्रकार की सामग्री भेजते हैं तो यह ब्राउज़र को भ्रमित करता है। यह एक बग है, क्योंकि अधिकांश प्रतिक्रियाएं जेसन हैं, जिसका अर्थ है कि सबसे समझदार डिफ़ॉल्ट सामग्री प्रकार एप्लिकेशन/जेसन होना चाहिए।

सौभाग्य से वहाँ सर्वर विधि के भीतर से सामग्री प्रकार ओवरराइड करने के लिए एक तरीका है।

आप अपने कार्यान्वयन का उपयोग करता है सूची में Data.DBXPlatform जोड़ने की जरूरत है।

इस इकाई समारोह GetInvocationMetadata, जो प्रतिक्रिया है कि निर्माण किया जा रहा है करने के लिए पहुँच देता है शामिल हैं। यह TDSInvocationMetadata ऑब्जेक्ट देता है जो कि अन्य उपयोगी गुणों के बीच ResponseContentType संपत्ति है।

इस गुण को सेट Content-Type हैडर कि विधि http जवाब में रिटर्न ओवरराइड करता है।

दिए गए उदाहरण बन जाता है:

function TServerClass.Image: TFileStream; 
begin 
    Result := TFileStream.Create('pathtofile\image.png', fmOpenRead or fmShareDenyNone); 
    GetInvocationMetadata.ResponseContentType := 'image/png'; 
end; 

अब परिणाम छवि ब्राउज़र में ठीक तरह से प्रदर्शित किया जाएगा।

1

मुझे यह समस्या डेटास्नाप आरईएसटी सर्वर (डेल्फी एक्सई 3) से एक जावास्क्रिप्ट वेब क्लाइंट में विभिन्न फ़ाइल प्रकारों (पीएनजी, पीडीएफ, एक्सएलएसएक्स, डॉक्क्स, इत्यादि ...) डाउनलोड करने का भी प्रयास कर रही है। कुछ ब्राउज़र्स (एस .: फ़ायरफ़ॉक्स) वैसे भी सही कार्रवाई करेंगे, लेकिन सभी नहीं। इंटरनेट एक्सप्लोरर डाउनलोड की गई फ़ाइल के लिए सही सामग्री-प्रकार के बिना उचित कार्रवाई को नहीं पहचानता है। शुरुआत में @ एंडर्स समाधान मेरे लिए काम करता प्रतीत होता है क्योंकि मैं पीडीएफ और फ़ायरफ़ॉक्स के साथ काम कर रहा था। लेकिन जब मैंने आईई (और अन्य) और विभिन्न एक्सटेंशन के साथ परीक्षण किया है, तो फाइलें जिन्हें पहचाना नहीं गया है। FireBug का उपयोग करते हुए मैंने देखा है कि सामग्री प्रकार हमेशा सौंपा एक

GetInvocationMetadata.ResponseContentType := '...my assigned content type ...'; 

वैकल्पिक हल का उपयोग कर मेरे लिए काम कर पाया था, "text/html" और नहीं है:

ServerMethodsUnit में

var 
    ContentTypeHeaderToUse: string; // Global variable 

TServerMethods1.GetFile(params: JSON):TStream; 
begin 
    .... processing .... 
    ContentTypeHeaderToUse := '...' (assign correct content type). 
end; 

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; 

मैं बताए सामग्री-विन्यास के लिए एक समान समाधान के लिए इस्तेमाल किया भी। डाउनलोड करने और अनुलग्नक/इनलाइन मोड में फ़ाइल नाम सेट करने के लिए यह एक उपयोगी हेडर कुंजी है। यह एक कोड है के साथ:

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; 

असाइन ContentDispositionHeaderToUse सर्वर तरीकों कार्यान्वयन में।

संपादित

इस तरीके को डेटा संपीड़न सक्षम साथ आईआईएस पर ISAPI DLL में काम नहीं करता! कोई डेटा compressione (स्थानीय debuggin आईआईएस) प्रतिक्रिया हेडर है के साथ:

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 

सामग्री-स्वभाव और सामग्री प्रकार DataSnap कोड में सौंपा:

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 

लेकिन उत्पादन को सक्षम करने पर प्रतिक्रिया IIS के साथ आता है सामने नहीं आ रहे हैं।

संबंधित मुद्दे