প্লেইন পুরাতন ব্যবহার করে কোনও ফাইল পোস্ট করার জন্য কীভাবে আমি একটি এএসপিএন ওয়েব ফর্ম (v3.5) পেতে <input type="file" />
পারি?
আমি এএসপিএনটি ফাইল আপলোড সার্ভার নিয়ন্ত্রণ ব্যবহার করতে আগ্রহী নই।
প্লেইন পুরাতন ব্যবহার করে কোনও ফাইল পোস্ট করার জন্য কীভাবে আমি একটি এএসপিএন ওয়েব ফর্ম (v3.5) পেতে <input type="file" />
পারি?
আমি এএসপিএনটি ফাইল আপলোড সার্ভার নিয়ন্ত্রণ ব্যবহার করতে আগ্রহী নই।
উত্তর:
আপনার এসপ্সে:
<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/… - তবে আপনি এই সমস্ত বাইট ক্লায়েন্ট-সাইডের সাথে কী করতে যাচ্ছেন? ওপি এএসপি। নেট নিয়ন্ত্রণ-না সার্ভার-সাইড যোগাযোগ পুরোপুরি এড়াতে চায়। -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"]
এবং ওপি যখন সরাসরি এএসপি। নেট ব্যবহার করতাম এবং এমভিসি ব্যবহার করতাম না, যদি কেউ এমভিসির জন্য এটি ব্যবহার করতে চায় তবে আপনার HttpPostedFileBase
পরিবর্তে কেবল প্রয়োজন HttpPostedFile
।
আপনাকে এর enctype
বৈশিষ্ট্যটি সেট form
করতে হবে multipart/form-data
; তারপরে আপনি HttpRequest.Files
সংগ্রহটি ব্যবহার করে আপলোড করা ফাইলটি অ্যাক্সেস করতে পারেন ।
একটি রানাত সার্ভার বৈশিষ্ট্য সহ এইচটিএমএল নিয়ন্ত্রণ ব্যবহার করুন
<input id="FileInput" runat="server" type="file" />
তারপরে এসপ নেট কোডেহাইডে
FileInput.PostedFile.SaveAs("DestinationPath");
কিছু 3 য় পক্ষের বিকল্প রয়েছে যা আপনি আগ্রহী হলে অগ্রগতি দেখায়
<asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>
) এড়াতে চেয়েছিল runat=server
এটি input
ক্ষেত্রের উপরে না রাখার চেয়ে ভিন্ন ।
HtmlInputFile
নিয়ন্ত্রণও।
হ্যাঁ আপনি আজাক্স পোস্ট পদ্ধতি দ্বারা এটি অর্জন করতে পারেন। সার্ভার সাইডে আপনি 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();
}
}
}
}
fs.close()
আইআইএসের মধ্যে তারা কোনও না কোনওভাবে খোলা থাকার কারণে অন্য কোনও কিছু যুক্ত করার জন্য আপনার ইঙ্গিতটি যুক্ত করা উচিত read
অনুরোধ.ফায়াল্স সংগ্রহে আপনার ফর্মের সাথে আপলোড করা যে কোনও ফাইল রয়েছে যা সে ফাইলআপলোড নিয়ন্ত্রণ থেকে এসেছে বা ম্যানুয়ালি লিখিত হয়েছে তা নির্বিশেষে <input type="file">
।
সুতরাং আপনি আপনার ওয়েবফোর্মের মাঝখানে কেবল একটি সাধারণ পুরানো ফাইল ইনপুট ট্যাগ লিখতে পারেন এবং তারপরে অনুরোধ.ফায়ার্স সংগ্রহ থেকে আপলোড করা ফাইলটি পড়তে পারেন।
অন্যের যেমন উত্তর রয়েছে, অনুরোধ.ফায়ালস হ'ল এইচটিপি ফাইল ফাইল রয়েছে যা পোস্ট করা সমস্ত ফাইল ধারণ করে, আপনাকে কেবল ফাইলটির জন্য সেই অবজেক্টটি জিজ্ঞাসা করতে হবে:
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);
}
}
}
এই এক্সটেনশন পদ্ধতিটি যদি উপস্থিত থাকে তবে এইচটিটিপি ফাইললেকশনে "মাইফাইলস" নাম থাকা সমস্ত এইচটিটিপিপোস্টডফাইলে অবজেক্টগুলি ফিরিয়ে আনবে।
আমি এই সব সময় ব্যবহার করেছি।
runat="server"
যা এটিকে মূলত এটি একটি সার্ভার নিয়ন্ত্রণে পরিণত করে, যা তারা ব্যবহার করতে চায় না।
//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"