Comment puis-je obtenir un formulaire Web ASP.net (v3.5) pour publier un fichier en utilisant un ancien <input type="file" />
?
Je ne suis pas intéressé par l'utilisation du contrôle serveur ASP.net FileUpload.
Comment puis-je obtenir un formulaire Web ASP.net (v3.5) pour publier un fichier en utilisant un ancien <input type="file" />
?
Je ne suis pas intéressé par l'utilisation du contrôle serveur ASP.net FileUpload.
Réponses:
Dans votre 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>
Dans le code derrière:
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];
et vous pouvez même obtenir les octets en utilisant readAsArrayBuffer
: stackoverflow.com/questions/37134433/... - mais qu'allez -vous faire avec tous ces octets côté client? L'OP veut éviter complètement la communication côté serveur de contrôle ASP .NET. -1 à vous.
Voici une solution sans dépendre d'aucun contrôle côté serveur, tout comme OP l'a décrit dans la question.
Code HTML côté client:
<form action="upload.aspx" method="post" enctype="multipart/form-data">
<input type="file" name="UploadedFile" />
</form>
Page Load.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]
place de Request.Files["UploadedFile"]
et tandis que l'OP utilisait ASP .NET pur et non MVC, si quelqu'un veut l'utiliser pour MVC, vous avez juste besoin HttpPostedFileBase
de HttpPostedFile
.
Vous devrez définir l' enctype
attribut du form
à multipart/form-data
; alors vous pouvez accéder au fichier téléchargé en utilisant la HttpRequest.Files
collection.
utiliser le contrôle HTML avec un attribut serveur runat
<input id="FileInput" runat="server" type="file" />
Puis dans asp.net Codebehind
FileInput.PostedFile.SaveAs("DestinationPath");
Il existe également des options de troisième partie qui afficheront la progression si vous êtes intéressé
<asp:FileUpload ID="fileUpload1" runat="server"></asp:FileUpload>
) C'est différent de dire de ne pas mettre un runat=server
sur un input
champ.
HtmlInputFile
contrôle.
Oui, vous pouvez y parvenir par la méthode ajax post. côté serveur, vous pouvez utiliser httphandler. Nous n'utilisons donc aucun contrôle de serveur selon vos besoins.
avec ajax, vous pouvez également afficher la progression du téléchargement.
vous devrez lire le fichier en tant que flux d'entrée.
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);
}
}
Exemple de code
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()
tout le reste pourrait finir dans des fichiers illisibles car ils restent en quelque sorte ouverts dans IIS.
La collection Request.Files contient tous les fichiers téléchargés avec votre formulaire, qu'ils proviennent d'un contrôle FileUpload ou d'un fichier <input type="file">
.
Vous pouvez donc simplement écrire une ancienne balise d'entrée de fichier au milieu de votre WebForm, puis lire le fichier téléchargé depuis la collection Request.Files.
Comme d'autres ont une réponse, Request.Files est un HttpFileCollection qui contient tous les fichiers qui ont été publiés, il vous suffit de demander à cet objet le fichier comme ceci:
Request.Files["myFile"]
Mais que se passe-t-il lorsqu'il y a plus d'un balisage d'entrée avec le même nom d'attribut:
Select file 1 <input type="file" name="myFiles" />
Select file 2 <input type="file" name="myFiles" />
Côté serveur, le code précédent Request.Files ["myFile"] ne renvoie qu'un seul objet HttpPostedFile au lieu des deux fichiers. J'ai vu sur .net 4.5 une méthode d'extension appelée GetMultiple mais pour les versions précédentes, elle n'existe pas, d'ailleurs je propose la méthode d'extension comme:
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);
}
}
}
Cette méthode d'extension renverra tous les objets HttpPostedFile qui ont le nom «myFiles» dans HttpFileCollection s'il en existe.
Je l'ai utilisé tout le temps.
runat="server"
ce qui le transforme essentiellement en un contrôle serveur, qu'ils ne voulaient pas utiliser.
Voici un article de Code Project avec un projet téléchargeable qui prétend résoudre ce problème. Avertissement: je n'ai pas testé ce code. 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"
, elle n'est pas indépendante du serveur d'ASP.NET