FileUpload सर्वर नियंत्रण का उपयोग किए बिना ASP.net में फ़ाइलें अपलोड करना


99

एक सादे पुराने का उपयोग करके एक फ़ाइल पोस्ट करने के लिए मुझे ASP.net वेब फॉर्म (v3.5) कैसे मिल सकता है <input type="file" />?

मुझे ASP.net FileUpload सर्वर नियंत्रण का उपयोग करने में कोई दिलचस्पी नहीं है।

जवाबों:


133

अपने aspx में:

<form id="form1" runat="server" enctype="multipart/form-data">
 <input type="file" id="myFile" name="myFile" />
 <asp:Button runat="server" ID="btnUpload" OnClick="btnUploadClick" Text="Upload" />
</form>

पीछे कोड में:

protected void btnUploadClick(object sender, EventArgs e)
{
    HttpPostedFile file = Request.Files["myFile"];

    //check file was submitted
    if (file != null && file.ContentLength > 0)
    {
        string fname = Path.GetFileName(file.FileName);
        file.SaveAs(Server.MapPath(Path.Combine("~/App_Data/", fname)));
    }
}

3
@ मैथ्यू, दया जो आप वैरिएंट का उपयोग करते हैं runat="server", वह ASP.NET के सर्वर सामान से स्वतंत्र नहीं है
गुप्त

क्या होगा अगर 1 से अधिक इनपुट हैं और आप फ़ाइलों के दोनों सेट के साथ अलग-अलग कार्य करना चाहते हैं।
नेविल नाजरीन

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

@ मर्टिना कई फाइलों को सहेजने के लिए इस कोड स्निपेट की जाँच करें
sohaiby

1
@DanielJ। यदि आप बाद में फ़ाइल के साथ कुछ भी करने जा रहे हैं, यानी इसे डेटाबेस में संग्रहीत करने के लिए कोड-पीछे का उपयोग करने का कोई संभव तरीका नहीं है। ज़रूर, आप इनपुट और फ़ाइल को हथियाने के लिए सीधे जावास्क्रिप्ट का उपयोग कर सकते हैं: var fileUploaded = document.getElementById("myFile").files[0];और आप यहां तक ​​कि बाइट प्राप्त कर सकते हैं readAsArrayBuffer: stackoverflow.com/questions/37134433/… - लेकिन आप उन सभी बाइट्स क्लाइंट-साइड के साथ क्या करने जा रहे हैं? ओपी पूरी तरह से एएसपी .NET कंट्रोल-नॉट सर्वर-साइड संचार से बचना चाहता है। -1 आप को।
vapcguy

40

यहाँ किसी भी सर्वर-साइड नियंत्रण पर भरोसा किए बिना एक समाधान है, जैसे ओपी ने प्रश्न में वर्णित किया है।

क्लाइंट साइड HTML कोड:

<form action="upload.aspx" method="post" enctype="multipart/form-data">
    <input type="file" name="UploadedFile" />
</form>

अपलोड करने की विधि।

if(Request.Files["UploadedFile"] != null)
{
    HttpPostedFile MyFile = Request.Files["UploadedFile"];
    //Setting location to upload files
    string TargetLocation = Server.MapPath("~/Files/");
    try
    {
        if (MyFile.ContentLength > 0)
        {
            //Determining file name. You can format it as you wish.
            string FileName = MyFile.FileName;
            //Determining file size.
            int FileSize = MyFile.ContentLength;
            //Creating a byte array corresponding to file size.
            byte[] FileByteArray = new byte[FileSize];
            //Posted file is being pushed into byte array.
            MyFile.InputStream.Read(FileByteArray, 0, FileSize);
            //Uploading properly formatted file to server.
            MyFile.SaveAs(TargetLocation + FileName);
        }
    }
    catch(Exception BlueScreen)
    {
        //Handle errors
    }
}

HTTPFebRequest कॉल के लिए MyFile.FileName में पूर्ण फ़ाइल पथ भेजने के लिए देखें। WebClient कॉल सिर्फ फ़ाइल नाम भेजता है। HTTPWebRequest MyFile.SaveAs को विफल करने का कारण होगा। बस एक ग्राहक का काम करते हुए और एक ग्राहक का पीछा करते हुए घंटों बर्बाद नहीं हुआ।
बॉब क्लेग

मैं बस के Request.Files[0]बजाय का Request.Files["UploadedFile"]उपयोग करता था और जबकि ओपी सीधे एएसपी .NET का उपयोग कर रहा था और एमवीसी का नहीं, अगर कोई एमवीसी के लिए इसका उपयोग करना चाहता है, तो आपको HttpPostedFileBaseइसके बजाय बस आवश्यकता है HttpPostedFile
vapcguy

23

आप सेट करना होगा enctypeकी विशेषता formके लिए multipart/form-data; तब आप HttpRequest.Filesसंग्रह का उपयोग करके अपलोड की गई फ़ाइल तक पहुंच सकते हैं ।


मेरा सर्वर फॉर्म एक मास्टर पेज पर था और मैं मल्टीपार्ट / फॉर्म-डेटा नहीं जोड़ सकता था (तब से यह हर पेज पर होगा)। एक त्वरित और गंदे वर्कअराउंड पेज में एक हिडन FileUpload नियंत्रण जोड़ना था। WebForms ने फिर मल्टीपार्ट / फॉर्म-डेटा को स्वचालित रूप से जोड़ा। मुझे यह करना पड़ा क्योंकि मैं Angular2 के साथ एक फ़ाइल इनपुट का उपयोग कर रहा था और घटक टेम्पलेट में सर्वर नियंत्रण का उपयोग नहीं कर सकता था।
जेसन

9

एक रनैट सर्वर विशेषता के साथ HTML नियंत्रण का उपयोग करें

 <input id="FileInput" runat="server" type="file" />

फिर asp.net Codebehind में

 FileInput.PostedFile.SaveAs("DestinationPath");

3'rd पार्टी के कुछ विकल्प भी हैं जो यदि आप घुसपैठ करते हैं तो प्रगति दिखाएंगे


3
फिर, कि यह एक सर्वर नियंत्रण में बदल रहा है। ;)
आह्वान

@ahwm ओपी ASP। NET FileUpload नियंत्रण ( <asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>) से बचना चाहता था जो कि runat=serverएक inputक्षेत्र पर नहीं डालने के लिए कहने से अलग है ।
vapcguy

1
मुझे लगता है कि इसका मतलब है कि वे ASP.NET नियंत्रणों का उपयोग नहीं करना चाहते हैं। जिसमें HtmlInputFileनियंत्रण शामिल है ।
आह्वान

8

हाँ आप इसे अजाक्स पोस्ट विधि द्वारा प्राप्त कर सकते हैं। सर्वर की ओर से आप httphandler का उपयोग कर सकते हैं। इसलिए हम आपकी आवश्यकता के अनुसार किसी भी सर्वर नियंत्रण का उपयोग नहीं कर रहे हैं।

अजाक्स के साथ आप अपलोड की प्रगति भी दिखा सकते हैं।

आपको फ़ाइल को इनपुटस्ट्रीम के रूप में पढ़ना होगा।

using (FileStream fs = File.Create("D:\\_Workarea\\" + fileName))
    {
        Byte[] buffer = new Byte[32 * 1024];
        int read = context.Request.GetBufferlessInputStream().Read(buffer, 0, buffer.Length);
        while (read > 0)
        {
            fs.Write(buffer, 0, read);
            read = context.Request.GetBufferlessInputStream().Read(buffer, 0, buffer.Length);
        }
    } 

नमूना कोड

function sendFile(file) {              
        debugger;
        $.ajax({
            url: 'handler/FileUploader.ashx?FileName=' + file.name, //server script to process data
            type: 'POST',
            xhr: function () {
                myXhr = $.ajaxSettings.xhr();
                if (myXhr.upload) {
                    myXhr.upload.addEventListener('progress', progressHandlingFunction, false);
                }
                return myXhr;
            },
            success: function (result) {                    
                //On success if you want to perform some tasks.
            },
            data: file,
            cache: false,
            contentType: false,
            processData: false
        });
        function progressHandlingFunction(e) {
            if (e.lengthComputable) {
                var s = parseInt((e.loaded / e.total) * 100);
                $("#progress" + currFile).text(s + "%");
                $("#progbarWidth" + currFile).width(s + "%");
                if (s == 100) {
                    triggerNextFileUpload();
                }
            }
        }
    }

2
हो सकता है कि आपको fs.close()कुछ भी जोड़ने के लिए संकेत जोड़ना चाहिए, क्योंकि वे किसी भी तरह से अपठनीय फाइलों में समाप्त हो सकते हैं क्योंकि वे IIS के भीतर किसी तरह खुले रहते हैं।
मिस्टेक

@mistapink क्या फ़ाइल स्ट्रीम बंद नहीं है जब निष्पादन ब्लॉक का उपयोग करना छोड़ देता है?
सेबी

@ सेबी ऐसा लगता है कि लगभग 3 साल पहले ऐसा नहीं था। लंबे समय तक इसकी कोशिश नहीं की, इसलिए मैं यहां एक निश्चित जवाब नहीं दे सकता। मुझे क्षमा करें।
गलती से

4

Request.Files के कलेक्शन में आपके फॉर्म के साथ अपलोड की गई कोई भी फाइल शामिल है, चाहे वे किसी FileUpload नियंत्रण से आए हों या मैन्युअल रूप से लिखे गए हों <input type="file">

तो आप बस अपने WebForm के बीच में एक सादा पुराना फ़ाइल इनपुट टैग लिख सकते हैं, और फिर Request.Files संग्रह से अपलोड की गई फ़ाइल को पढ़ सकते हैं।


4

जैसा कि अन्य का जवाब है, Request.Files एक HttpFileCollection है जिसमें सभी फाइलें पोस्ट की गई हैं, आपको केवल इस तरह की फाइल के लिए उस ऑब्जेक्ट को पूछने की आवश्यकता है:

Request.Files["myFile"]

लेकिन तब क्या होता है जब एक ही विशेषता नाम के साथ एक से अधिक इनपुट मार्क-अप होते हैं:

Select file 1 <input type="file" name="myFiles" />
Select file 2 <input type="file" name="myFiles" />

सर्वर साइड पर पिछला कोड Request.Files ["myFile"] दो फाइलों के बजाय केवल एक HttpPostedFile ऑब्जेक्ट लौटाता है। मैंने .net 4.5 पर एक विस्तार विधि देखी है, जिसे गेटमल्लट कहा जाता है, लेकिन पहले से मौजूद संस्करणों के लिए यह मौजूद नहीं है, इस बात के लिए कि मैं विस्तार विधि का प्रस्ताव करता हूं:

public static IEnumerable<HttpPostedFile> GetMultiple(this HttpFileCollection pCollection, string pName)
{
        for (int i = 0; i < pCollection.Count; i++)
        {
            if (pCollection.GetKey(i).Equals(pName))
            {
                yield return pCollection.Get(i);
            }
        }
}

यह एक्सटेंशन विधि उन सभी HttpPostedFile ऑब्जेक्ट्स को लौटाएगी, जिनका नाम "myFiles" है HttpFileCollection में यदि मौजूद है।


2

HtmlInputFile नियंत्रण

मैंने हर समय इसका उपयोग किया है।


2
runat="server"इसे जोड़ने की आवश्यकता है जो अनिवार्य रूप से इसे सर्वर नियंत्रण में बदल देता है, जिसे वे उपयोग नहीं करना चाहते थे।
आह्वान

@ahwm नहीं, ओपी विशिष्ट ASP .NET FileUpload नियंत्रण का उपयोग नहीं करना चाहता था। यह कहने की तुलना में अलग है कि वे सामान्य रूप से सर्वर-साइड नियंत्रण का उपयोग नहीं करना चाहते थे।
vapcguy

1

यहां एक डाउनलोड करने योग्य परियोजना के साथ एक कोड प्रोजेक्ट लेख है जो इसे हल करने के लिए उद्देश्य रखता है। अस्वीकरण: मैंने इस कोड का परीक्षण नहीं किया है। http://www.codeproject.com/KB/aspnet/fileupload.aspx


0
//create a folder in server (~/Uploads)
 //to upload
 File.Copy(@"D:\CORREO.txt", Server.MapPath("~/Uploads/CORREO.txt"));

 //to download
             Response.ContentType = ContentType;
             Response.AppendHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName("~/Uploads/CORREO.txt"));
             Response.WriteFile("~/Uploads/CORREO.txt");
             Response.End();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.