代码之家  ›  专栏  ›  技术社区  ›  Ronnie Overby

不使用fileupload服务器控件在ASP.NET中上载文件

  •  94
  • Ronnie Overby  · 技术社区  · 15 年前

    如何让ASP.NET Web窗体(v3.5)使用普通旧窗体发布文件 <input type="file" /> ?

    我对使用ASP.NET文件上载服务器控件不感兴趣。

    谢谢你的建议。

    10 回复  |  直到 8 年前
        1
  •  130
  •   Caius Jard    12 年前

    在你的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)));
        }
    }
    
        2
  •  38
  •   Aycan Yaşıt    9 年前

    这里有一个不依赖任何服务器端控制的解决方案,就像OP在问题中描述的那样。

    客户端HTML代码:

    <form action="upload.aspx" method="post" enctype="multipart/form-data">
        <input type="file" name="UploadedFile" />
    </form>
    

    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
        }
    }
    
        3
  •  22
  •   Majid    11 年前

    你必须设置 enctype 的属性 form multipart/form-data ; 然后您可以使用 HttpRequest.Files 收集。

        4
  •  9
  •   cgreeno    15 年前

    使用带有runat服务器属性的HTML控件

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

    然后在ASP.NET代码隐藏中

     FileInput.PostedFile.SaveAs("DestinationPath");
    

    还有一些 3'rd party 如果您感兴趣,将显示进度的选项

        5
  •  7
  •   Undo ptrk    8 年前

    是的,您可以通过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();
                    }
                }
            }
        }
    
        6
  •  4
  •   David    15 年前

    request.files集合包含随表单上载的任何文件,无论这些文件是来自fileupload控件还是手动写入的 <input type="file"> .

    因此,您只需在Web表单中间编写一个普通的旧文件输入标记,然后读取从request.files集合上载的文件。

        7
  •  3
  •   Joey O    9 年前

    正如其他人回答的那样,request.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);
                }
            }
    }
    

    此扩展方法将返回httpfilecollection中名为“myfiles”的所有httpPostedFile对象(如果存在)。

        8
  •  2
  •   Lurker Indeed    15 年前

    HtmlInputFile control

    我一直在用这个。

        9
  •  1
  •   Bork Blatt    15 年前

    这是一篇代码项目文章,其中包含一个可下载的项目,旨在解决这个问题。免责声明:我没有测试过此代码。 http://www.codeproject.com/KB/aspnet/fileupload.aspx

        10
  •  0
  •   kRiZ    8 年前
    //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();