首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用FileUpload维护AllowMultiple=true中选定文件的顺序

用FileUpload维护AllowMultiple=true中选定文件的顺序
EN

Stack Overflow用户
提问于 2017-05-20 17:29:16
回答 1查看 1.5K关注 0票数 7

我有一个<asp:FileUpload>控件,属性AllowMultiple设置为true:

代码语言:javascript
复制
<asp:fileupload id="FileUpload" runat="server" allowmultiple="true" cssclass="fileUpload btn btn-sm btn-default" onchange="preloadImages()" />

<div class="field col-md-2 col-md-offset-1 immScarpePreview MainPreviewBox">
 <asp:image id="Image1" runat="server" visible="false" cssclass="img-responsive" />
 <asp:button id="ImmButton" runat="server" text="Upload" onclick="ImmButton_Click" cssclass="hidden" />
</div>

在我的JavaScript函数中,我模拟对不可见按钮的单击:

代码语言:javascript
复制
<script>
    function preloadImages() {
        $('#<%=ImmButton.ClientID%>').trigger('click');
    }
</script>

在代码隐藏中,我将文件保存到一个临时文件夹中,并在<asp:Image>控件中显示上传的图像:

代码语言:javascript
复制
 protected void ImmButton_Click(object sender, EventArgs e)
 {
        if (FileUpload.HasFile)
        {
            try
            {
                int cont = 0;
                byte[] fileData = null;
                foreach (HttpPostedFile file in FileUpload.PostedFiles)
                {
                    if (cont == 0)
                    {
                        using (var binaryReader = new BinaryReader(file.InputStream))
                            fileData = binaryReader.ReadBytes(file.ContentLength);
                        File.WriteAllBytes(Server.MapPath("immScarpe/tmp/" + file.FileName), fileData);
                        setImage1("immScarpe/tmp/" + file.FileName);
                    }
                    else if (cont == 1)
                    {
                        using (var binaryReader = new BinaryReader(file.InputStream))
                            fileData = binaryReader.ReadBytes(file.ContentLength);
                        File.WriteAllBytes(Server.MapPath("immScarpe/tmp/" + file.FileName), fileData);
                        setImage2("immScarpe/tmp/" + file.FileName);
                    }
                    else if (cont == 2)
                     //and so on...

                    //so on...
                    cont++;
                }
            }
            catch(Exception ex)
            {
                //error writing file
                Console.Write(ex.Message);
            }
        }
 }

 private void setImage1(string image) //all equals for all the 5 images
 {
     Image1.ImageUrl = image;
     Image1.Visible = true;
 }

这件事做得很好,但我需要帮助。当我遍历FileUpload.PostedFiles时,我认为所选图像的顺序是字母顺序的。我想保持用户选择的顺序。这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-25 03:36:11

我有个坏消息,至少如果你在使用Windows。

我在Windows 10上使用Chrome、Edge、Firefox和Internet测试了您的代码,并使用Telerik Fiddler检查了HTTP请求。我在所有浏览器中得到了相同的结果:

  • FileUpload.PostedFiles集合中的文件顺序与HTTP中的顺序相同;ASP.NET不对集合中的文件进行排序。
  • HTTP请求中的文件顺序与upload控件中的顺序相同;浏览器不对HTTP请求中的文件进行排序。(要查看上传控件中的文件,我禁用了您的preloadImages函数。)
  • 上载控件(以及客户端files集合)中的文件顺序不一定与文件选择对话框中的文件名框中的顺序相同。
    • 如果手动按顺序键入文件名,则upload控件将按键入文件的顺序列出文件,FileUpload.PostedFiles集合将保持该顺序。
    • 但是,如果我按Ctrl+clicking顺序选择文件,那么upload控件将按字母顺序列出文件,FileUpload.PostedFiles集合也是如此。

在最后一种情况下,我假设Windows在将文件交给浏览器之前对它们进行排序。如果是这样的话,那么浏览器就永远不会收到用户选择的原始顺序,因此您无法维护这个顺序,即使使用JavaScript也不行。

如果您绝对必须维护多个上载文件的顺序,那么您可能需要有多个<asp:FileUpload>控件,每个控件都带有AllowMultiple="False"

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44088923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档