Wie kann ich ein ASP.net-Webformular (v3.5) dazu bringen, eine Datei mit einem einfachen alten zu veröffentlichen <input type="file" />
?
Ich bin nicht an der Verwendung des ASP.net FileUpload-Serversteuerelements interessiert.
Wie kann ich ein ASP.net-Webformular (v3.5) dazu bringen, eine Datei mit einem einfachen alten zu veröffentlichen <input type="file" />
?
Ich bin nicht an der Verwendung des ASP.net FileUpload-Serversteuerelements interessiert.
Antworten:
In Ihrem 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>
Im Code dahinter:
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];
und Sie können sogar die Bytes mit bekommen readAsArrayBuffer
: stackoverflow.com/questions/37134433/... - aber was werden Sie mit allen , die Bytes Client-Seite zu tun? Das OP möchte die ASP .NET-Steuerung und nicht die serverseitige Kommunikation insgesamt vermeiden. -1 für dich.
Hier ist eine Lösung, ohne sich auf eine serverseitige Steuerung zu verlassen, wie es OP in der Frage beschrieben hat.
Clientseitiger HTML-Code:
<form action="upload.aspx" method="post" enctype="multipart/form-data">
<input type="file" name="UploadedFile" />
</form>
Page Load-Methode von 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]
anstelle von Request.Files["UploadedFile"]
und während das OP gerade ASP .NET und nicht MVC verwendet, wenn jemand dies für MVC verwenden möchte, brauchen Sie nur HttpPostedFileBase
anstelle von HttpPostedFile
.
Sie werden die festlegen müssen enctype
Attribut des form
zu multipart/form-data
; Anschließend können Sie über die HttpRequest.Files
Sammlung auf die hochgeladene Datei zugreifen .
Verwenden Sie das HTML-Steuerelement mit einem Runat-Server-Attribut
<input id="FileInput" runat="server" type="file" />
Dann in asp.net Codebehind
FileInput.PostedFile.SaveAs("DestinationPath");
Es gibt auch einige Optionen für Dritte , die den Fortschritt anzeigen, wenn Sie interessiert sind
<asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>
) , das anders ist als zu sagen , kein setzen runat=server
auf einem input
Feld.
HtmlInputFile
Kontrolle.
Ja, Sie können dies mit der Ajax-Post-Methode erreichen. Auf der Serverseite können Sie httphandler verwenden. Daher verwenden wir keine Serversteuerelemente gemäß Ihren Anforderungen.
Mit Ajax können Sie auch den Upload-Fortschritt anzeigen.
Sie müssen die Datei als Eingabestream lesen.
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);
}
}
Beispielcode
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()
alles andere in unlesbaren Dateien landet, da diese in IIS irgendwie offen bleiben.
Die Request.Files-Auflistung enthält alle Dateien, die mit Ihrem Formular hochgeladen wurden, unabhängig davon, ob sie von einem FileUpload-Steuerelement stammen oder manuell geschrieben wurden <input type="file">
.
Sie können also einfach ein einfaches altes Dateieingabe-Tag in die Mitte Ihrer WebForm schreiben und dann die aus der Request.Files-Sammlung hochgeladene Datei lesen.
Wie andere antworten, ist Request.Files eine HttpFileCollection, die alle Dateien enthält, die veröffentlicht wurden. Sie müssen nur dieses Objekt nach der Datei wie folgt fragen:
Request.Files["myFile"]
Was passiert jedoch, wenn mehr als ein Eingabe-Markup mit demselben Attributnamen vorhanden ist:
Select file 1 <input type="file" name="myFiles" />
Select file 2 <input type="file" name="myFiles" />
Auf der Serverseite gibt der vorherige Code Request.Files ["myFile"] anstelle der beiden Dateien nur ein HttpPostedFile-Objekt zurück. Ich habe auf .net 4.5 eine Erweiterungsmethode namens GetMultiple gesehen, aber für frühere Versionen existiert sie nicht. Im Übrigen schlage ich die Erweiterungsmethode wie folgt vor:
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);
}
}
}
Diese Erweiterungsmethode gibt alle HttpPostedFile-Objekte zurück, die den Namen "myFiles" in der HttpFileCollection haben, falls vorhanden.
Ich habe das die ganze Zeit benutzt.
runat="server"
was es im Wesentlichen in ein Serversteuerelement verwandelt, das sie nicht verwenden wollten.
Hier ist ein Code Project-Artikel mit einem herunterladbaren Projekt, das vorgibt, dieses Problem zu lösen. Haftungsausschluss: Ich habe diesen Code nicht getestet. 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"
, es ist nicht unabhängig von den Server-Sachen von ASP.NET