2010-02-10 18 views
10

में मैं एक webservice का उपयोग कर किसी वेबसाइट से ब्राउज़र पर एक फ़ाइल को धक्का देना चाहता हूं। मैं वर्तमान में फ़ाइल को बेस 64 बाइट सरणी में पढ़ रहा हूं, और इसे webservice से वापस कर रहा हूं। इस webservice को किसी वेबसाइट से बुलाया जाता है, और मैं ब्राउज़र पर मूल फ़ाइल के रूप में इसे धक्का देने के तरीके पर अटक गया हूं। आदर्श रूप में मैं बाइट सरणी को मेमोरी स्ट्रीम में पढ़ना चाहता हूं, और फिर इसे संभवतः प्रतिक्रिया स्ट्रीम पर लिखूं यदि अंतिम उपयोगकर्ता सिर्फ फ़ाइल डाउनलोड करता है। आप फ़ाइल नाम नियंत्रित करना चाहते हैं तो आप सामग्री जोड़ना होगाwebservice से फ़ाइल डाउनलोड करें - ASP.NET साइट

Response.ContentType = "image/jpeg"; 
Response.OutputStream.Write(buffer, 0, buffer.Length); 

,:

+0

और क्या ASP.NET में आप के साथ अपलोड की गई फ़ाइल का उपयोग कर सकते क्या आप उस दृष्टिकोण के साथ हैं? आपने एक सवाल नहीं पूछा था, इसलिए यह शायद बहुत जल्दी बंद हो जाएगा। – Oded

उत्तर

12

पहले, बेस 64 बाइट सरणी भेजने के बजाय, अपनी वेब सेवा को अपनी फ़ाइल के लिए बस बाइट सरणी वापस कर दें। Response.OutputStream.Write() स्वचालित रूप से बेस बाइट को आपके बाइट एन्कोड करेगा, इसलिए आप उन्हें अपनी मेमोरी स्ट्रीम में अन-एन्कोड भी कर सकते हैं।

दूसरा, आपको केवल बाइट्स से अधिक की आवश्यकता होगी। आपको फ़ाइल से जुड़े मेटा-डेटा की आवश्यकता होगी। नीचे स्निपेट के लिए, मैंने उस मेटाडाटा को एक अलग वर्ग में रखा है (स्थानीय उदाहरण "फ़ाइल" नाम दिया गया है)। फिर, बस इस स्निपेट का उपयोग, एक बार आप डेटा है कि आप की जरूरत है:

Response.Clear(); 
Response.ClearHeaders(); 
Response.ContentType = file.ContentType; 
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\""); 
Response.AddHeader("Content-Length", file.FileSize.ToString()); 
Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length); 
Response.Flush(); 
Response.End(); 
+3

Response.End() http://stackoverflow.com/questions/1087777/is-response-end-cononsidered-harmful –

+0

@ टोड स्मिथ: सूचक के लिए धन्यवाद। मुझे इस मुद्दे से अवगत था, लेकिन आप सही हैं कि अन्य शायद नहीं; यह एक गंभीर गेटचा हो सकता है। फ़ाइल डाउनलोड के मामले में, हालांकि, कोई और प्रसंस्करण नहीं है जिसे आप करना चाहते हैं या करना चाहिए, और इस प्रकार 'Response.End() '* * सही कॉल होने की संभावना है। यह निश्चित रूप से मेरे मामले में है। – Randolpho

+2

क्या मुझे Repsonse.End() के बजाय Response.Close() का उपयोग करना चाहिए? – user210757

3

यह संभव है, क्या आप वाकई स्पष्ट HttpResponse के ContentType सेट बनाने के लिए, उदाहरण के लिए की आवश्यकता होगी डिस्पोजिशन हेडर। Google इसे हल करने का सही तरीका ढूंढने में आपकी सहायता कर सकता है।

+0

+1, हालांकि आपने सामग्री-डिस्पोजिशन छोड़ा है, जो फ़ाइल डाउनलोड के लिए सबसे महत्वपूर्ण है। संपादित करें: और फिर आपने इसे जोड़ा। तो इसे अनदेखा करें। :) – Randolpho

0

यह वास्तव में अपने वेब सेवा करने के लिए इंटरफेस पर निर्भर करता है। आईई एसओएपी, आरईएसटी, एएसपीएक्स।

एक चीज जिसे आप कोशिश कर सकते हैं सामग्री-प्रकार को "एप्लिकेशन/ऑक्टेट-स्ट्रीम" में अपने प्रतिक्रिया में बदलना है। या रिसीवर को एमआईएमई प्रकार बताने के समान कुछ।

यदि आप डब्ल्यूसीएफ आराम का उपयोग करते हैं तो आप वेब सेवा पर रिटर्न प्रकार के रूप में स्ट्रीम का उपयोग कर सकते हैं।

1

आमतौर पर वेब सेवा में फ़ाइल एम्बेड करना एक बुरा विचार है। आप केवल वास्तविक लाभ के साथ ओवरहेड और जटिलता जोड़ते हैं।

इसके बजाय आपको फ़ाइल अपलोड को संभालने के लिए IHttpHandler प्रदान करना चाहिए। अधिकांश वेब सर्वर इसे सरल बनाने के लिए सहायक एपीआई भी प्रदान करते हैं, उदा।

HttpContext.Request.Files [0]

जावास्क्रिप्ट फाइल अपलोड लिपियों के बहुत सारे है कि ग्राहक पर इस आसान बनाने में कर रहे हैं: http://www.phpletter.com/Demo/AjaxFileUpload-Demo/

+0

मैं वास्तव में क्लाइंट को फ़ाइलों को डाउनलोड करने का प्रयास कर रहा हूं, सर्वर – user210757

+0

पर अपलोड नहीं करता हूं कि लिंक या तो स्पैम है या समय पर इसका संदर्भ खो गया है। – mcy

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