2013-04-18 7 views
8

में नियंत्रक के अंदर एक कार्रवाई में http प्रतिक्रिया में हेडर जोड़कर मैं filestream.write का उपयोग कर डाउनलोड करने के लिए सर्वर से क्लाइंट स्ट्रीम कर रहा हूं। उस स्थिति में क्या हो रहा है कि मैं फ़ाइल डाउनलोड करने में सक्षम हूं लेकिन यह मेरे ब्राउज़र में डाउनलोड के रूप में दिखाई नहीं देता है। न तो "सेव एज़" के लिए पॉप-अप डाउनलोड अनुभाग में "डाउनलोड बार" दिखाई नहीं देता है। चारों ओर देखने से, मुझे लगता है कि ब्राउज़र को यह बताने के लिए प्रतिक्रिया हेडर में "कुछ" शामिल करने की आवश्यकता है कि इस प्रतिक्रिया के साथ अनुलग्नक है। मैं भी कुकी सेट करना चाहता हूँ।एएसपीनेट/एमवीसी

 [HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name)] 
    public ActionResult Download(string name) 
    { 
      // some more code to get data in inputstream. 

      using (FileStream fs = System.IO.File.OpenWrite(TargetFile)) 
      { 
       byte[] buffer = new byte[SegmentSize]; 
       int bytesRead; 
       while ((bytesRead = inputStream.Read(buffer, 0, SegmentSize)) > 0) 
       { 
        fs.WriteAsync(buffer, 0, bytesRead); 
       } 
      } 
     } 
     return RedirectToAction("Index"); 
    } 

मैं त्रुटि हो रही है कि: इसे पूरा करने के लिए इस मैं क्या कर रहा हूँ है। "System.web.httpcontext.current एक संपत्ति है और एक प्रकार के रूप में प्रयोग किया जाता है"

क्या मैं सही स्थान पर हेडर अपडेट कर रहा हूं? ऐसा करने के लिए कोई और रास्ता नहीं है?

उत्तर

11

हां, आप इसे गलत तरीके से करने का प्रयास कर रहे हैं, आपको अपनी क्रिया के अंदर हेडर जोड़ना चाहिए, न कि आपकी विधि में एक विशेषता हेडर के रूप में।

HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name) 

या

Request.RequestContext.HttpContext.Response.AddHeader("Content-Disposition", "Attachment;filename=" & name) 

अद्यतन के रूप में मैं समझता हूँ आप अपने नियंत्रक/कार्रवाई जो सीधे एक कार्रवाई को फोन करके फ़ाइल डाउनलोड के लिए अभ्यस्त काम करने के लिए एक ajax कॉल कर रहे हैं। आप इसे इस तरह से प्राप्त कर सकते हैं।

public void Download(string name) 
     { 
//your logic. Sample code follows. You need to write your stream to the response. 

      var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf"); 
      var stream = new MemoryStream(filestream); 
      stream.WriteTo(Response.OutputStream); 
      Response.AddHeader("Content-Disposition", "Attachment;filename=targetFileName.pdf"); 
      Response.ContentType = "application/pdf"; 
     } 

या

public FileStreamResult Download(string name) 
    { 
     var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf"); 
     var stream = new MemoryStream(filestream); 


     return new FileStreamResult(stream, "application/pdf") 
     { 
      FileDownloadName = "targetfilename.pdf" 
     }; 
    } 

अपने जे एस बटन में आप सिर्फ इस के लिए इसी तरह कुछ कर सकते हैं पर क्लिक करें।

$('#btnDownload').click(function() { 
      window.location.href = "controller/download?name=yourargument"; 
    }); 
+0

मैं यह कर की कोशिश की।लेकिन यह अभी भी ब्राउज़र के डाउनलोड अनुभाग में "सेव एज़" डायलॉग बॉक्स और न ही डाउनलोड प्रोग्रेस बार दिखाएं। – ezile

+0

यह मेरे लिए काम करता है और मुझे लगता है कि मेरे टेस्ट केस में एचटीएमएल डाउनलोड हो रहा है। आपके लिए ऐसा इसलिए हो सकता है क्योंकि आप कार्यवाही पर पुनर्निर्देशित कर रहे हैं। हालांकि मैंने इस परिदृश्य की कोशिश नहीं की है। बस कोशिश करने के लिए इंडेक्स के तहत इस हेडर को रखने का प्रयास करें। – PSL

+0

मैं थोड़ी अधिक जानकारी दूंगा। मैं "इंडेक्स" पृष्ठ पर हूं और फिर डाउनलोड पर क्लिक करता हूं जो जावास्क्रिप्ट के माध्यम से डाउनलोड एक्शन कॉल करता है। उपरोक्त कोड डाउनलोड एक्शन में लिखा गया है। और उपयोगकर्ता को फ़ाइल स्ट्रीम करने के बाद, मैं इंडेक्स पेज पर रीडायरेक्ट करता हूं। मैं उलझन में हूं कि मुझे ब्राउजर को कब कहना चाहिए कि एक डाउनलोड है। मेरा मतलब है कि मैं FileStream.WriteSync का उपयोग कर सामान भेज रहा हूं, इसलिए मुझे लगता है कि मुझे फ़ाइल भेजने से पहले ब्राउज़र को बताना होगा कि एक अनुलग्नक है और इस प्रकार यह "के रूप में सहेजें" संवाद बॉक्स पॉप-अप करेगा। मुझे लगता है कि मैं वर्कफ़्लो में उलझन में हूं और इस प्रकार मैं कब और कहां बदल सकता हूं। – ezile

3

कृपया एक नज़र here ले।

संदर्भित वेबसाइट से निम्नलिखित लिया जाता है।

public FileStreamResult StreamFileFromDisk() 
{ 
    string path = AppDomain.CurrentDomain.BaseDirectory + "uploads/"; 
    string fileName = "test.txt"; 
    return File(new FileStream(path + fileName, FileMode.Open), "text/plain", fileName); 
} 

संपादित करें 1:

कुछ जोड़ा जा रहा है कि हमारे अच्छे ol 'अतः से अपने हित के और अधिक हो सकता है। आप पूरी जानकारी here के लिए देख सकते हैं।

public ActionResult Download() 
{ 
    var document = ... 
    var cd = new System.Net.Mime.ContentDisposition 
    { 
     // for example foo.bak 
     FileName = document.FileName, 

     // always prompt the user for downloading, set to true if you want 
     // the browser to try to show the file inline 
     Inline = false, 
    }; 
    Response.AppendHeader("Content-Disposition", cd.ToString()); 
    return File(document.Data, document.ContentType); 
} 
0

बदलें:

return RedirectToAction("Index"); 

रहे हैं:

return File(fs, "your/content-type", "filename"); 

और अपने कथन का उपयोग अंदर करने के लिए वापसी कथन चलते हैं।

0

अतीत में मैंने कुछ डोमेन को मेरी साइट को आईफ्रेम करने की अनुमति देने के लिए एक श्वेतसूची बनाई थी। Google की छवि कैश को iframe साइट्स पर भी इस्तेमाल किया याद रखें।

static HashSet<string> frameWhiteList = new HashSet<string> { "www.domain.com", 
                "mysub.domain.tld", 
                "partner.domain.tld" }; 

    protected void EnforceFrameSecurity() 
    { 
     var framer = Request.UrlReferrer; 
     string frameOptionsValue = "SAMEORIGIN"; 

     if (framer != null) 
     { 
      if (frameWhiteList.Contains(framer.Host)) 
      { 
       frameOptionsValue = string.Format("ALLOW-FROM {0}", framer.Host); 
      } 

     } 

     if (string.IsNullOrEmpty(HttpContext.Current.Response.Headers["X-FRAME-OPTIONS"])) 
     { 
      HttpContext.Current.Response.AppendHeader("X-FRAME-OPTIONS", frameOptionsValue); 
     } 
    } 
0
public FileResult DownloadDocument(string id) 
     { 
      if (!string.IsNullOrEmpty(id)) 
      { 
       try 
       { 
        var fileId = Guid.Parse(id); 

       var myFile = AppModel.MyFiles.SingleOrDefault(x => x.Id == fileId); 

       if (myFile != null) 
       { 
        byte[] fileBytes = myFile.FileData; 
        return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, myFile.FileName); 
       } 
      } 
      catch 
      { 
      } 
     } 

     return null; 
    }