Як я можу отримати веб-форму ASP.net (v3.5) для публікації файлу за допомогою простої старої <input type="file" />
?
Мені не цікаво використовувати керування сервером ASP.net FileUpload.
Як я можу отримати веб-форму ASP.net (v3.5) для публікації файлу за допомогою простої старої <input type="file" />
?
Мені не цікаво використовувати керування сервером ASP.net FileUpload.
Відповіді:
У вашій аспіксі:
<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/… - але що ви збираєтеся робити з усіма цими байтами на стороні клієнта? ОП хоче взагалі уникнути зв'язку ASP .NET, а не на сервері. -1 тобі.
Ось рішення, не покладаючись на будь-яке управління на стороні сервера, подібно до того, як ОП описано у питанні.
HTML код на стороні клієнта:
<form action="upload.aspx" method="post" enctype="multipart/form-data">
<input type="file" name="UploadedFile" />
</form>
Метод Page_Load upload.aspx:
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"]
і в той час як OP використовує прямий ASP .NET і не MVC, якщо хто -то хоче використовувати це для MVC, потрібно просто HttpPostedFileBase
замість HttpPostedFile
.
Вам доведеться встановити enctype
атрибут form
до multipart/form-data
; то ви можете отримати доступ до завантаженого файлу за допомогою HttpRequest.Files
колекції.
використовувати керування HTML з атрибутом сервера runat
<input id="FileInput" runat="server" type="file" />
Потім в asp.net Codebehind
FileInput.PostedFile.SaveAs("DestinationPath");
Також є кілька варіантів третьої партії , які покажуть прогрес, якщо вас зацікавить
<asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>
) Це інакше, ніж казати не ставити поле runat=server
на input
поле.
HtmlInputFile
контроль.
Так, ви можете домогтися цього методом ajax post. на стороні сервера ви можете використовувати httphandler. Таким чином, ми не використовуємо ніяких елементів управління сервером відповідно до вашої вимоги.
за допомогою ajax ви також можете продемонструвати хід завантаження.
вам доведеться читати файл як вхідний потік.
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">
.
Таким чином, ви можете просто написати звичайний старий тег для введення файлів у середині веб-форми, а потім прочитати файл, завантажений із колекції 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 метод розширення, який називається GetMultiple, але для переконливих версій він не існує, для цього я пропоную метод розширення як:
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