ফাইলআপলোড সার্ভার নিয়ন্ত্রণ ব্যবহার না করে এএসপিএনটিতে ফাইলগুলি আপলোড করা হচ্ছে


98

প্লেইন পুরাতন ব্যবহার করে কোনও ফাইল পোস্ট করার জন্য কীভাবে আমি একটি এএসপিএন ওয়েব ফর্ম (v3.5) পেতে <input type="file" />পারি?

আমি এএসপিএনটি ফাইল আপলোড সার্ভার নিয়ন্ত্রণ ব্যবহার করতে আগ্রহী নই।

উত্তর:


132

আপনার এসপ্সে:

<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)));
    }
}

4
@ মাথিউ, আপনার যে রূপটি ব্যবহার করে তা অনুগ্রহ করে, এটি এএসপি.নেটrunat="server"
সিক্রেট

যদি 1 টিরও বেশি ইনপুট থাকে এবং আপনি উভয় সেট ফাইলের সাথে পৃথক ফাংশন সম্পাদন করতে চান what
নেভিল নাজিরেন

একাধিক ফাইল আপলোড করার জন্য এটি ব্যবহার করার সময়, এটি সমস্ত ফাইলের জন্য একই ফাইলের নাম ফেরত দেয় এবং তাই প্রথমবারের প্রথম বারের এন নম্বর সংরক্ষণ করে। এটি পেতে কিভাবে কোন ধারণা?
সোহাইবি

@ মার্টিনা একাধিক ফাইল সংরক্ষণের জন্য এই কোড স্নিপেটটি দেখুন
sohaiby

4
@ ড্যানিয়েলজে কোডটি পিছনে ব্যবহার না করার কোনও সম্ভাব্য উপায় নেই যদি আপনি পরে ফাইলটি দিয়ে কিছু করতে যাচ্ছেন, অর্থাত্ এটি একটি ডাটাবেসে সংরক্ষণ করে। অবশ্যই, আপনি ইনপুট এবং ফাইলটি ধরার জন্য সরাসরি জাভাস্ক্রিপ্ট ব্যবহার করতে পারেন: var fileUploaded = document.getElementById("myFile").files[0];এবং আপনি এমনকি বাইটগুলিও পেতে পারেন readAsArrayBuffer: stackoverflow.com/questions/37134433/… - তবে আপনি এই সমস্ত বাইট ক্লায়েন্ট-সাইডের সাথে কী করতে যাচ্ছেন? ওপি এএসপি। নেট নিয়ন্ত্রণ-না সার্ভার-সাইড যোগাযোগ পুরোপুরি এড়াতে চায়। -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
    }
}

মাইফাইলে.ফিলনামে পুরো ফাইল পাথ প্রেরণের জন্য HTTPWebRequest কলটি দেখুন। ওয়েবক্লিয়েন্ট কল কেবল ফাইলের নাম পাঠায়। HTTPWebRequest এর ফলে MyFile.SaveAs ব্যর্থ হবে। একজন ক্লায়েন্ট কর্মরত এবং একজন ক্লায়েন্টকে না তাড়া করার জন্য কেবল সময়গুলি নষ্ট করে।
বব Clegg

আমি কেবল এর Request.Files[0]পরিবর্তে Request.Files["UploadedFile"]এবং ওপি যখন সরাসরি এএসপি। নেট ব্যবহার করতাম এবং এমভিসি ব্যবহার করতাম না, যদি কেউ এমভিসির জন্য এটি ব্যবহার করতে চায় তবে আপনার HttpPostedFileBaseপরিবর্তে কেবল প্রয়োজন HttpPostedFile
vapcguy

23

আপনাকে এর enctypeবৈশিষ্ট্যটি সেট formকরতে হবে multipart/form-data; তারপরে আপনি HttpRequest.Filesসংগ্রহটি ব্যবহার করে আপলোড করা ফাইলটি অ্যাক্সেস করতে পারেন ।


আমার সার্ভার ফর্মটি একটি মাস্টার পৃষ্ঠায় ছিল এবং আমি মাল্টিপার্ট / ফর্ম-ডেটা যোগ করতে পারিনি (তারপরে এটি প্রতিটি পৃষ্ঠায় থাকবে)। একটি তাত্পর্যপূর্ণ ও নোংরা কাজটি ছিল পৃষ্ঠায় একটি লুকানো ফাইলআপলোড নিয়ন্ত্রণ যুক্ত করা। ওয়েব ফোরামগুলি তখন স্বয়ংক্রিয়ভাবে মাল্টিপার্ট / ফর্ম-ডেটা যুক্ত করে। আমাকে এটি করতে হয়েছিল কারণ আমি Angular2 এর সাথে একটি ফাইল ইনপুট ব্যবহার করছি এবং কোনও উপাদান টেম্পলেটে একটি সার্ভার নিয়ন্ত্রণ ব্যবহার করতে পারিনি।
জেসন

9

একটি রানাত সার্ভার বৈশিষ্ট্য সহ এইচটিএমএল নিয়ন্ত্রণ ব্যবহার করুন

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

তারপরে এসপ নেট কোডেহাইডে

 FileInput.PostedFile.SaveAs("DestinationPath");

কিছু 3 য় পক্ষের বিকল্প রয়েছে যা আপনি আগ্রহী হলে অগ্রগতি দেখায়


4
আবার, এটি এটিকে সার্ভার নিয়ন্ত্রণে পরিণত করছে। ;)
অহউইএম

@ahwm ওপি এএসপি। নেট ফাইলআপলোড নিয়ন্ত্রণ ( <asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>) এড়াতে চেয়েছিল runat=serverএটি inputক্ষেত্রের উপরে না রাখার চেয়ে ভিন্ন ।
vapcguy

4
আমি এটিকে বোঝাতে চাইছি তারা এএসপি.এনইটি নিয়ন্ত্রণ ব্যবহার করতে চায় না। যার মধ্যে রয়েছে HtmlInputFileনিয়ন্ত্রণও।
অহ্ম্ম

8

হ্যাঁ আপনি আজাক্স পোস্ট পদ্ধতি দ্বারা এটি অর্জন করতে পারেন। সার্ভার সাইডে আপনি HThandler ব্যবহার করতে পারেন। সুতরাং আমরা আপনার প্রয়োজন অনুযায়ী কোনও সার্ভার নিয়ন্ত্রণ ব্যবহার করছি না।

এজ্যাক্সের সাহায্যে আপনি আপলোডের অগ্রগতিও প্রদর্শন করতে পারেন।

আপনাকে ইনপুটস্ট্রিম হিসাবে ফাইলটি পড়তে হবে।

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();
                }
            }
        }
    }

4
fs.close()আইআইএসের মধ্যে তারা কোনও না কোনওভাবে খোলা থাকার কারণে অন্য কোনও কিছু যুক্ত করার জন্য আপনার ইঙ্গিতটি যুক্ত করা উচিত read

@ মিস্টাপিংক যখন এক্সিকিউশনটি ব্যবহারের ব্লকটি ছেড়ে দেয় তখন ফাইল স্ট্রিম বন্ধ হয় না?
সেবি

@ শেবি প্রায় 3 বছর আগে মনে হয় না। এটি দীর্ঘ সময় চেষ্টা করে দেখেনি, তাই আমি এখানে একটি নির্দিষ্ট উত্তর দিতে পারি না। আমি দুঃখিত.
mistapink

4

অনুরোধ.ফায়াল্স সংগ্রহে আপনার ফর্মের সাথে আপলোড করা যে কোনও ফাইল রয়েছে যা সে ফাইলআপলোড নিয়ন্ত্রণ থেকে এসেছে বা ম্যানুয়ালি লিখিত হয়েছে তা নির্বিশেষে <input type="file">

সুতরাং আপনি আপনার ওয়েবফোর্মের মাঝখানে কেবল একটি সাধারণ পুরানো ফাইল ইনপুট ট্যাগ লিখতে পারেন এবং তারপরে অনুরোধ.ফায়ার্স সংগ্রহ থেকে আপলোড করা ফাইলটি পড়তে পারেন।


4

অন্যের যেমন উত্তর রয়েছে, অনুরোধ.ফায়ালস হ'ল এইচটিপি ফাইল ফাইল রয়েছে যা পোস্ট করা সমস্ত ফাইল ধারণ করে, আপনাকে কেবল ফাইলটির জন্য সেই অবজেক্টটি জিজ্ঞাসা করতে হবে:

Request.Files["myFile"]

তবে একই বৈশিষ্ট্যের নামের সাথে একাধিক ইনপুট মার্ক-আপ থাকলে কী ঘটে:

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

সার্ভারের পাশের আগের কোড রিকোয়েস্ট.ফায়ালস ["মাইফাইল"] কেবলমাত্র দুটি ফাইলের পরিবর্তে একটি এইচটিপিপोस्টেড ফাইল প্রত্যাবর্তন করে। আমি নেট নেট 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);
            }
        }
}

এই এক্সটেনশন পদ্ধতিটি যদি উপস্থিত থাকে তবে এইচটিটিপি ফাইললেকশনে "মাইফাইলস" নাম থাকা সমস্ত এইচটিটিপিপোস্টডফাইলে অবজেক্টগুলি ফিরিয়ে আনবে।


2

এইচটিএমএলপুটফাইলে নিয়ন্ত্রণ

আমি এই সব সময় ব্যবহার করেছি।


4
এর জন্য এটি যুক্ত করা দরকার runat="server"যা এটিকে মূলত এটি একটি সার্ভার নিয়ন্ত্রণে পরিণত করে, যা তারা ব্যবহার করতে চায় না।
আহ্মে

@ অহম্ম না, ওপি নির্দিষ্ট এএসপি। নেট ফাইলআপলোড নিয়ন্ত্রণ ব্যবহার করতে চায় নি। এটি সাধারণভাবে তারা কোনও সার্ভার-সাইড নিয়ন্ত্রণ ব্যবহার করতে চান না বলার চেয়ে আলাদা।
vapcguy

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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.