एक सादे पुराने का उपयोग करके एक फ़ाइल पोस्ट करने के लिए मुझे ASP.net वेब फॉर्म (v3.5) कैसे मिल सकता है <input type="file" />
?
मुझे ASP.net FileUpload सर्वर नियंत्रण का उपयोग करने में कोई दिलचस्पी नहीं है।
एक सादे पुराने का उपयोग करके एक फ़ाइल पोस्ट करने के लिए मुझे ASP.net वेब फॉर्म (v3.5) कैसे मिल सकता है <input type="file" />
?
मुझे ASP.net FileUpload सर्वर नियंत्रण का उपयोग करने में कोई दिलचस्पी नहीं है।
जवाबों:
अपने 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)));
}
}
var fileUploaded = document.getElementById("myFile").files[0];
और आप यहां तक कि बाइट प्राप्त कर सकते हैं readAsArrayBuffer
: stackoverflow.com/questions/37134433/… - लेकिन आप उन सभी बाइट्स क्लाइंट-साइड के साथ क्या करने जा रहे हैं? ओपी पूरी तरह से एएसपी .NET कंट्रोल-नॉट सर्वर-साइड संचार से बचना चाहता है। -1 आप को।
यहाँ किसी भी सर्वर-साइड नियंत्रण पर भरोसा किए बिना एक समाधान है, जैसे ओपी ने प्रश्न में वर्णित किया है।
क्लाइंट साइड 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
}
}
Request.Files[0]
बजाय का Request.Files["UploadedFile"]
उपयोग करता था और जबकि ओपी सीधे एएसपी .NET का उपयोग कर रहा था और एमवीसी का नहीं, अगर कोई एमवीसी के लिए इसका उपयोग करना चाहता है, तो आपको HttpPostedFileBase
इसके बजाय बस आवश्यकता है HttpPostedFile
।
आप सेट करना होगा enctype
की विशेषता form
के लिए multipart/form-data
; तब आप HttpRequest.Files
संग्रह का उपयोग करके अपलोड की गई फ़ाइल तक पहुंच सकते हैं ।
एक रनैट सर्वर विशेषता के साथ HTML नियंत्रण का उपयोग करें
<input id="FileInput" runat="server" type="file" />
फिर asp.net Codebehind में
FileInput.PostedFile.SaveAs("DestinationPath");
3'rd पार्टी के कुछ विकल्प भी हैं जो यदि आप घुसपैठ करते हैं तो प्रगति दिखाएंगे
<asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>
) से बचना चाहता था जो कि runat=server
एक input
क्षेत्र पर नहीं डालने के लिए कहने से अलग है ।
HtmlInputFile
नियंत्रण शामिल है ।
हाँ आप इसे अजाक्स पोस्ट विधि द्वारा प्राप्त कर सकते हैं। सर्वर की ओर से आप 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();
}
}
}
}
fs.close()
कुछ भी जोड़ने के लिए संकेत जोड़ना चाहिए, क्योंकि वे किसी भी तरह से अपठनीय फाइलों में समाप्त हो सकते हैं क्योंकि वे IIS के भीतर किसी तरह खुले रहते हैं।
Request.Files के कलेक्शन में आपके फॉर्म के साथ अपलोड की गई कोई भी फाइल शामिल है, चाहे वे किसी FileUpload नियंत्रण से आए हों या मैन्युअल रूप से लिखे गए हों <input type="file">
।
तो आप बस अपने WebForm के बीच में एक सादा पुराना फ़ाइल इनपुट टैग लिख सकते हैं, और फिर Request.Files संग्रह से अपलोड की गई फ़ाइल को पढ़ सकते हैं।
जैसा कि अन्य का जवाब है, 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 में यदि मौजूद है।
मैंने हर समय इसका उपयोग किया है।
runat="server"
इसे जोड़ने की आवश्यकता है जो अनिवार्य रूप से इसे सर्वर नियंत्रण में बदल देता है, जिसे वे उपयोग नहीं करना चाहते थे।
यहां एक डाउनलोड करने योग्य परियोजना के साथ एक कोड प्रोजेक्ट लेख है जो इसे हल करने के लिए उद्देश्य रखता है। अस्वीकरण: मैंने इस कोड का परीक्षण नहीं किया है। http://www.codeproject.com/KB/aspnet/fileupload.aspx
//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();
runat="server"
, वह ASP.NET के सर्वर सामान से स्वतंत्र नहीं है