Eski bir dosya kullanarak göndermek için ASP.net web formu (v3.5) nasıl edinebilirim <input type="file" />
?
ASP.net FileUpload sunucu denetimini kullanmakla ilgilenmiyorum.
Eski bir dosya kullanarak göndermek için ASP.net web formu (v3.5) nasıl edinebilirim <input type="file" />
?
ASP.net FileUpload sunucu denetimini kullanmakla ilgilenmiyorum.
Yanıtlar:
Aspx'inizde:
<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>
Arkasındaki kodda:
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];
almak için doğrudan JavaScript'i kullanabilirsiniz: ve hatta baytları şu şekilde de alabilirsiniz readAsArrayBuffer
: stackoverflow.com/questions/37134433/… - ama tüm bu baytlarla istemci tarafında ne yapacaksınız? OP, ASP .NET kontrolü-sunucu tarafı iletişiminden tamamen kaçınmak ister. -1 size.
İşte OP'nin soruda açıkladığı gibi, herhangi bir sunucu tarafı kontrolüne güvenmeden bir çözüm.
İstemci tarafı HTML kodu:
<form action="upload.aspx" method="post" enctype="multipart/form-data">
<input type="file" name="UploadedFile" />
</form>
Upload.aspx'in Page_Load yöntemi:
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]
yerine kullandım Request.Files["UploadedFile"]
ve OP, MVC'yi değil, doğrudan ASP .NET'i kullanırken, bunu MVC için kullanmak isteyen varsa, HttpPostedFileBase
bunun yerine ihtiyacınız var HttpPostedFile
.
İçin enctype
özniteliğini ayarlamanız form
gerekir multipart/form-data
; daha sonra HttpRequest.Files
koleksiyonu kullanarak yüklenen dosyaya erişebilirsiniz .
HTML kontrolünü runat sunucusu niteliği ile kullanma
<input id="FileInput" runat="server" type="file" />
Sonra asp.net Codebehind'de
FileInput.PostedFile.SaveAs("DestinationPath");
Ayrıca, ilginizi çekerseniz ilerlemeyi gösterecek bazı 3. taraf seçenekleri de vardır.
<asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>
) kaçınmak istedi. Bu, runat=server
bir input
alana a koymayın demekten farklıdır .
HtmlInputFile
kontrolü içerir .
Evet, bunu ajax posta yöntemi ile elde edebilirsiniz. sunucu tarafındahtphandler kullanabilirsiniz. Bu nedenle, ihtiyacınıza göre herhangi bir sunucu kontrolü kullanmıyoruz.
ajax ile yükleme ilerlemesini de gösterebilirsiniz.
dosyayı bir girdi akışı olarak okumanız gerekecek.
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);
}
}
Basit kod
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 içinde bir şekilde açık kaldıkları için okunamayan dosyalara gidebilecek her şeyi eklemek için ipucu eklemelisiniz .
Request.Files koleksiyonu, bir FileUpload denetiminden veya el ile yazılmış olmasından bağımsız olarak formunuzla yüklenen tüm dosyaları içerir <input type="file">
.
Böylece, WebForm'unuzun ortasına düz bir eski dosya giriş etiketi yazabilir ve ardından Request.Files koleksiyonundan yüklenen dosyayı okuyabilirsiniz.
Diğerlerinin cevabı olduğu için, Request.Files, gönderilen tüm dosyaları içeren bir HttpFileCollection'dır, yalnızca bu nesneyi dosya için şu şekilde istemeniz gerekir:
Request.Files["myFile"]
Ancak, aynı öznitelik adına sahip birden fazla girdi işaretlemesi olduğunda ne olur:
Select file 1 <input type="file" name="myFiles" />
Select file 2 <input type="file" name="myFiles" />
Sunucu tarafında önceki kod Request.Files ["myFile"], iki dosya yerine yalnızca bir HttpPostedFile nesnesi döndürür. .Net 4.5'te GetMultiple adlı bir uzantı yöntemi gördüm, ancak daha önce yapılan sürümler için mevcut değil, bu nedenle uzantı yöntemini şu şekilde öneriyorum:
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);
}
}
}
Bu uzantı yöntemi, varsa, HttpFileCollection'da "myFiles" adına sahip tüm HttpPostedFile nesnelerini döndürür.
Bunu her zaman kullandım.
runat="server"
onu kullanmak istemedikleri bir sunucu kontrolüne dönüştüren eklemeyi gerektirir .
İşte bunu çözmeyi amaçlayan indirilebilir bir projeye sahip bir Kod Projesi makalesi. Sorumluluk reddi: Bu kodu test etmedim. 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'in sunucu öğelerinden bağımsız değil