Comment puis-je obtenir un formulaire Web ASP.net (v3.5) pour publier un fichier à l'aide d'un ancien <input type="file" />
?
L'utilisation du contrôle serveur ASP.net FileUpload ne m'intéresse pas.
Merci pour vos suggestions.
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)));
}
}
Voici une solution qui ne repose sur aucun contrôle côté serveur, tout comme l’OP a décrit la question.
Code HTML côté client:
<form action="upload.aspx" method="post" enctype="multipart/form-data">
<input type="file" name="UploadedFile" />
</form>
Méthode Page_Load de 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
}
}
Vous devez définir l'attribut enctype
de form
sur multipart/form-data
; Vous pourrez alors accéder au fichier téléchargé à l'aide de la collection HttpRequest.Files
.
utiliser le contrôle HTML avec un attribut de serveur runat
<input id="FileInput" runat="server" type="file" />
Puis dans asp.net Codebehind
FileInput.PostedFile.SaveAs("DestinationPath");
Il y a aussi quelques 3ème partie options qui montreront les progrès si vous êtes intéressé
Oui, vous pouvez y parvenir par la méthode du message ajax. côté serveur, vous pouvez utiliser httphandler . Nous n'utilisons donc aucun contrôle 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();
}
}
}
}
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 <input type="file">
écrit manuellement.
Ainsi, vous pouvez simplement écrire une vieille balise d’entrée de fichier au milieu de votre formulaire Web, puis lire le fichier téléchargé à partir de la collection Request.Files.
Comme les autres ont une réponse, Request.Files est un HttpFileCollection qui contient tous les fichiers postés.
Request.Files["myFile"]
Mais que se passe-t-il quand il y a plus d'une balise 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" />
Du 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. Je propose d'ailleurs la méthode d'extension comme suit:
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 portant le nom "myFiles" dans HttpFileCollection, s'il en existe.
Je l'ai utilisé tout le temps.
Voici un article de Code Project avec un projet téléchargeable qui prétend résoudre ce problème. Disclaimer: 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();