2011-07-21 9 views
9

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

कोड:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
     e.Cancel = true; 
     string filepath = null; 
      filepath = textBox1.Text; 
      WebClient client = new WebClient(); 
      client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted); 
      client.DownloadFileAsync(e.Url, filepath); 
} 

पूर्ण sourcecode: http://en.paidpaste.com/LqEmiQ

+1

पोस्ट प्रासंगिक के कुछ हिस्सों: क्योंकि आप पहली बार एक लॉगिन अनुकरण करना चाहते हैं, तो आप इस बढ़ाया WebBrowser जो विंडोज Urlmon लिब से "URLDownloadToFile" विधि हुक और WebBrowser

Infos के संदर्भ का उपयोग करता है का उपयोग कर सकते यहां आपका कोड, सीधे प्रश्न में। बाहरी लिंक का प्रयोग न करें। –

+0

@ एंडर्स हाबेल, फिक्स्ड! –

+0

क्या आप सहेजने वाले फ़ाइल UI के ब्राउज़र के कार्यान्वयन को ओवरराइड करने का प्रयास कर रहे हैं? यदि आप स्ट्रीम में फ़ाइल लिखते हैं और सामग्री प्रकार में निर्दिष्ट करते हैं तो यह बहुत आसान होगा कि यह एक फ़ाइल है ... अगर मुझे सही याद है कि आपके पास आपके क्लाइंट के फाइल सिस्टम तक पहुंच नहीं है ... आप पथों पर फ़ाइलों को डाउनलोड नहीं कर सकते क्लाइंट पर इसलिए इसे इनपुट के रूप में लेना किसी भी उपयोग का नहीं है .. – Mulki

उत्तर

13

क्यों न केवल वेब क्लाइंट की फ़ाइल हैंडलिंग टुकड़ों को बाईपास करें। शायद यह करने के लिए कुछ इसी तरह:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
    { 
     e.Cancel = true; 
     WebClient client = new WebClient(); 

     client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(client_DownloadDataCompleted); 

     client.DownloadDataAsync(e.Url); 
    } 

    void client_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) 
    { 
     string filepath = textBox1.Text; 
     File.WriteAllBytes(filepath, e.Result); 
     MessageBox.Show("File downloaded"); 
    } 
0

webclient पर http://www.csharp-examples.net/download-files/ और MSDN डॉक्स पर एक नजर डालें http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx

मेरे सुझाव इसकी अधिक सरल रूप में तुल्यकालिक डाउनलोड करने का प्रयास है । आपको इस बात पर विचार हो सकते हैं कि वेब क्लाइंट पैरामीटर गलत हैं या फ़ाइल कोशिश करते समय गलत प्रारूप में है या नहीं।

यहाँ एक कोड नमूना है ..

private void btnDownload_Click(object sender, EventArgs e) 
{ 
    string filepath = textBox1.Text; 
    WebClient webClient = new WebClient(); 
    webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
    webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
    webClient.DownloadFileAsync(new Uri("http://mysite.com/myfile.txt"), filepath); 
} 

private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    progressBar.Value = e.ProgressPercentage; 
} 

private void Completed(object sender, AsyncCompletedEventArgs e) 
{ 
    MessageBox.Show("Download completed!"); 
} 
+0

समस्या यह है कि मैं चाहता हूं कि मेरा एप्लिकेशन फ़ाइल डाउनलोड करे, न कि इंटरनेट एक्सप्लोरर जो वेबब्रोसर के साथ चलता है। जब मैं ज़िप-फ़ाइल के लिंक पर क्लिक करता हूं, तो सेव-फ़ाइल पॉपअप प्रकट होता है और मुझे चीज़ें चुनना चाहती है। जब कोई उपयोगकर्ता ज़िप पर क्लिक करता है तो मैं फ़ाइल को स्वचालित रूप से डाउनलोड करना चाहता हूं। –

+0

@ विक्टर: अरे, .... मैंने पूरी तरह से प्रश्न को गलत समझा .. उत्तर – Mulki

0

ठीक है, अपने समाधान लगभग काम करता है।

  • रद्द केवल विशिष्ट URLs क्या आप जानते हैं एक डाउनलोड हो जाएगा के लिए डिफ़ॉल्ट नेविगेशन, या उपयोगकर्ता कहीं भी नेविगेट करने में सक्षम नहीं होगा: वहाँ ध्यान में रखना यह सरल रखने के लिए कुछ चीजें हैं। इसका मतलब है कि आप अपनी वेबसाइट डाउनलोड यूआरएल नहीं बदल सकते हैं।

  • DownloadFileAsyncContent-Disposition शीर्षलेख में सर्वर द्वारा रिपोर्ट किए गए नाम को नहीं जानता है, इसलिए आपको एक निर्दिष्ट करना होगा, या यदि संभव हो तो मूल URL से गणना करें। आप फ़ोल्डर को निर्दिष्ट नहीं कर सकते हैं और फ़ाइल नाम स्वचालित रूप से पुनर्प्राप्त होने की उम्मीद कर सकते हैं।

  • आपको DownloadCompleted कॉलबैक से डाउनलोड सर्वर त्रुटियों को संभालना होगा क्योंकि वेब ब्राउज़र नियंत्रण अब आपके लिए नहीं करेगा।

नमूना कोड का टुकड़ा, उस निर्देशिका textBox1 में निर्दिष्ट में डाउनलोड करेंगे, लेकिन एक यादृच्छिक फ़ाइल नाम के साथ, और किसी भी अतिरिक्त त्रुटि हैंडलिंग के बिना:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) { 
    /* change this to match your URL. For example, if the URL always is something like "getfile.php?file=xxx", try e.Url.ToString().Contains("getfile.php?") */ 
    if (e.Url.ToString().EndsWith(".zip")) { 
     e.Cancel = true; 
     string filePath = Path.Combine(textBox1.Text, Path.GetRandomFileName()); 
     var client = new WebClient(); 
     client.DownloadFileCompleted += client_DownloadFileCompleted; 
     client.DownloadFileAsync(e.Url, filePath); 
    } 
} 

private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) { 
    MessageBox.Show("File downloaded"); 
} 

यह समाधान काम करना चाहिए लेकिन हो सकता है बहुत आसानी से टूटा हुआ। उपलब्ध फ़ाइलों को डाउनलोड करने के लिए उपलब्ध कुछ वेब सेवा पर विचार करने की कोशिश करें और इसके लिए एक कस्टम यूआई बनाएं। यह आसान होगा और आप पूरी प्रक्रिया को नियंत्रित करेंगे।

+0

संशोधित करने के लिए मैंने कस्टम यूआई बनाने की भी कोशिश की लेकिन सफल नहीं हुआ। अभी भी एक बहुत ही बुनियादी स्तर पर सीखना और हर समय अटक जाना। लेकिन आपके समय और मदद के लिए धन्यवाद, मैं एक स्टेटस अपडेट के साथ वापस आऊंगा। –

+0

URL से फ़ाइल नाम को पुनः प्राप्त करना संभव है, बस इस 'स्ट्रिंग फ़ाइल नाम = पथ। गेटफाइलनाम (e.Url.LocalPath)' – rotman

+0

हां आज़माएं, लेकिन ऐसे कई मामले हैं जहां यह समझ में नहीं आता है, खासकर यदि डाउनलोड यूआरएल "डाउनलोड? आईडी = एक्स" रूप में है, आपको प्रत्येक फ़ाइल नाम के लिए "डाउनलोड" मिलेगा। –

17

मेरा प्रोग्राम ठीक वही करता है जो आप के बाद होते हैं, कोई संकेत या कुछ नहीं, कृपया निम्नलिखित कोड देखें।

यदि पहले से नहीं करते हैं इस कोड को आवश्यक निर्देशिका के सभी पैदा करेगा मौजूद हैं:

Directory.CreateDirectory(C:\dir\dira\dirb); // This code will create all of these directories 

इस कोड (दी निर्देशिका के लिए दिया फ़ाइल डाउनलोड करेगा के बाद यह पिछले टुकड़ा से बनाया गया है:

private void install() 
    { 
     WebClient webClient = new WebClient();               // Creates a webclient 
     webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);     // Uses the Event Handler to check whether the download is complete 
     webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); // Uses the Event Handler to check for progress made 
     webClient.DownloadFileAsync(new Uri("http://www.com/newfile.zip"), @"C\newfile.zip");   // Defines the URL and destination directory for the downloaded file 
    } 

तो कोड के इन दो टुकड़े का उपयोग कर आप निर्देशिका के सभी बनाने और उसके बाद डाउनलोडर बता सकते हैं (कि उस स्थान पर फाइल डाउनलोड करने का संकेत नहीं है।

+0

यदि यह फ़ाइल सर्वर पर संरक्षित फ़ोल्डर से प्राप्त की जा रही है तो क्या किया जाना चाहिए? उस स्थिति में आप सीधे सर्वर से फ़ाइल नहीं ला सकते हैं, लेकिन यदि फ़ाइल को सर्वर पर डाउनलोड करने और ब्राउज़र पर वापस भेजने के लिए संसाधित किया गया है। उस स्थिति में फ़ाइल फ़ाइल को सहेजने के बिना उस फ़ाइल को कैसे सहेज सकता है? कोई सुझाव?? –

+0

@ VipinKr.Singh यह वही परिदृश्य है जिसका मैं सामना कर रहा हूं। –

12

आप "WebClient" का उपयोग करें या/और System.Windows.Forms.WebBrowser उपयोग करने की आवश्यकता करने के लिए नहीं करना चाहते हैं जैसे http://www.pinvoke.net/default.aspx/urlmon/URLDownloadToFile%20.html

using System; 
using System.IO; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace dataCoreLib.Net.Webpage 
{ 
     public class WebBrowserWithDownloadAbility : WebBrowser 
     { 
      /// <summary> 
      /// The URLMON library contains this function, URLDownloadToFile, which is a way 
      /// to download files without user prompts. The ExecWB(_SAVEAS) function always 
      /// prompts the user, even if _DONTPROMPTUSER parameter is specified, for "internet 
      /// security reasons". This function gets around those reasons. 
      /// </summary> 
      /// <param name="callerPointer">Pointer to caller object (AX).</param> 
      /// <param name="url">String of the URL.</param> 
      /// <param name="filePathWithName">String of the destination filename/path.</param> 
      /// <param name="reserved">[reserved].</param> 
      /// <param name="callBack">A callback function to monitor progress or abort.</param> 
      /// <returns>0 for okay.</returns> 
      /// source: http://www.pinvoke.net/default.aspx/urlmon/URLDownloadToFile%20.html 
      [DllImport("urlmon.dll", CharSet = CharSet.Auto, SetLastError = true)] 
      static extern Int32 URLDownloadToFile(
       [MarshalAs(UnmanagedType.IUnknown)] object callerPointer, 
       [MarshalAs(UnmanagedType.LPWStr)] string url, 
       [MarshalAs(UnmanagedType.LPWStr)] string filePathWithName, 
       Int32 reserved, 
       IntPtr callBack); 


      /// <summary> 
      /// Download a file from the webpage and save it to the destination without promting the user 
      /// </summary> 
      /// <param name="url">the url with the file</param> 
      /// <param name="destinationFullPathWithName">the absolut full path with the filename as destination</param> 
      /// <returns></returns> 
      public FileInfo DownloadFile(string url, string destinationFullPathWithName) 
      { 
       URLDownloadToFile(null, url, destinationFullPathWithName, 0, IntPtr.Zero); 
       return new FileInfo(destinationFullPathWithName); 
      } 
     } 
    } 
+2

आप आदमी हैं! मैंने इस तरह के समाधान के लिए बिल्कुल 3 दिन बिताए! – Maciej

+1

बिल्कुल सही जवाब। – ujjaval

+1

यह समाधान सही है। प्रमाणीकरण के पीछे लैरवेल साइट से फ़ाइल डाउनलोड करने का प्रयास करते समय मैं इसके साथ समस्याएं मार रहा था, और वेब क्लाइंट डाउनलोड का उपयोग करते समय Auth :: उपयोगकर्ता() शून्य हो गया। –

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