Загрузка файлов в ASP.net без использования серверного элемента управления FileUpload

Как я могу получить ASP.net веб-форма (v3.5) опубликовать файл с помощью простого старого <input type="file" />?

Я не заинтересован в использовании ASP.net серверный элемент управления FileUpload.

Спасибо за ваши предложения.

10 ответов


в вашем 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>

в коде :

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)));
    }
}

вот решение, не полагаясь на какой-либо серверный контроль, так же, как OP описал в вопросе.

HTML-код на стороне клиента:

<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
    }
}

вам придется установить на form to multipart/form-data; затем вы можете получить доступ к загруженному файлу с помощью HttpRequest.Files коллекция.


используйте элемент управления HTML с атрибутом сервера runat

 <input id="FileInput" runat="server" type="file" />

затем в asp.net Codebehind

 FileInput.PostedFile.SaveAs("DestinationPath");

есть также некоторые 3-ей партии параметры, которые будут показывать прогресс, если вы интерестед


Да, вы можете достичь этого методом ajax post. на стороне сервера вы можете использовать httphandler. Таким образом, мы не используем серверные элементы управления согласно вашему требованию.

С ajax вы также можете показать ход загрузки.

вам нужно будет прочитать файл как inputstream.

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();
                }
            }
        }
    }

Запрос.Коллекция Files содержит любые файлы, загруженные в форму, независимо от того, были ли они получены из элемента управления FileUpload или написаны вручную <input type="file">.

таким образом, вы можете просто написать простой старый тег ввода файла в середине вашей веб-формы, а затем прочитать файл, загруженный из запроса.Коллекция файлов.


как другие имеют ответ, Запрос.Files-это HttpFileCollection, который содержит все файлы, которые были опубликованы, вам нужно только попросить этот объект для такого файла:

Request.Files["myFile"]

но что происходит, когда существует более одной входной метки с тем же именем атрибута:

Select file 1 <input type="file" name="myFiles" />
Select file 2 <input type="file" name="myFiles" />

на стороне сервера предыдущий запрос кода.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, если таковые существуют.


HtmlInputFile control

Я использовал это все время.


вот статья проекта кода с загружаемым проектом, который призван решить эту проблему. Отказ от ответственности: я не тестировал этот код. 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();