如何使 ajaxfileupload 与动态生成的文件输入一起工作

Posted

技术标签:

【中文标题】如何使 ajaxfileupload 与动态生成的文件输入一起工作【英文标题】:How to make ajaxfileupload work with dynamically generated file inputs 【发布时间】:2013-12-13 20:52:12 【问题描述】:

我需要在我的项目中使用这个plugin,但它似乎只有在将文件输入放入原始代码时才能正常工作。但是,当我尝试从动态生成的文件输入中调用它时, context.Request.Files.Count 总是返回 0。

这是我用作指导的article:

这就是我尝试使这篇文章适应我的需要的方式:

ASPX 和 jQuery:

<%@ Page Title="Página principal" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    <script src="Scripts/jquery-1.10.2.js" type="text/javascript"></script>
    <script src="Scripts/ajaxfileupload.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () 
            $("#btnGenerateFileInputs").click(function () 
                var body = $("#tbDatos > tbody");
                for (var i = 1; i <= 10; i++) 
                    var row = $("<tr>");
                    var col = $("<td>");
                    col.append(
                    "<div><input id='fupFile_" + i + "' type='file' accept='application/vnd.openxmlformats-officedocument.SpreadsheetML.Sheet'/>" +
                    "<input id='btnUpload_" + i + "' type='button' value='Upload' />" +
                    "</div>"
                    );
                    row.append(col);
                    body.append(row);
                    add_clickUploadFile("btnUpload_" + i);
                
            );
            function add_clickUploadFile(elemId) 
                elem = $("#" + elemId);         
                elem.on('click', function () 
                    var idFileUpload = $(this).prev().attr("id");
                    $.ajaxFileUpload(
                        url: 'AjaxFileUploader.ashx',
                        secureuri: false,
                        fileElementId: idFileUpload,
                        dataType: 'json',
                        success: function (data, status) 
                            if (typeof (data.error) != 'undefined') 
                                if (data.error != '') 
                                    alert(data.error);
                                 else 
                                    alert(data.msg);
                                
                            
                        ,
                        error: function (data, status, e) 
                            alert(e);
                        
                    );
                    return false;                    
                );
                        
        );
    </script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <input id="btnGenerateFileInputs" type="button" value="Generate File Inputs" />
    <table id="tbDatos" style="width: 100%;">
        <tbody>
        </tbody>
    </table>
</asp:Content>

处理程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;

namespace jQueryFileUpload

    
    public class AjaxFileuploader : IHttpHandler
    

        public void ProcessRequest(HttpContext context)
        
            if (context.Request.Files.Count > 0)
            
                string path = context.Server.MapPath("~/Temp");
                if (!Directory.Exists(path))
                    Directory.CreateDirectory(path);

                var file = context.Request.Files[0];

                string fileName;

                if (HttpContext.Current.Request.Browser.Browser.ToUpper() == "IE")
                
                    string[] files = file.FileName.Split(new char[]  '\\' );
                    fileName = files[files.Length - 1];
                
                else
                
                    fileName = file.FileName;
                
                string strFileName = fileName;
                fileName = Path.Combine(path, fileName);
                file.SaveAs(fileName);


                string msg = "";
                msg += string.Format("error:'0',\n", string.Empty);
                msg += string.Format("msg:'0'\n", strFileName);
                msg += "";
                context.Response.Write(msg);


            
        

        public bool IsReusable
        
            get
            
                return true;
            
        
    

文章中的例子和我上面贴的代码的主要区别如下:

我决定在创建按钮时不直接调用 JavaScript 函数:

然后当单击按钮时,调用处理程序,传递当前文件输入的 id。

正如我之前告诉你的,处理程序被调用,但context.Request.Files.Count 总是返回 0,就好像没有选择文件一样。

任何想法为什么会发生这种情况??

如往常一样,我们将不胜感激任何建议或指导。

提前致谢。

【问题讨论】:

【参考方案1】:

我在您的代码和文章代码中看到的区别在于您的输入字段缺少“名称”属性。所以尝试更改以下代码:

col.append(
    "<div><input id='fupFile_" + i + "' type='file' accept='application/vnd.openxmlformats-officedocument.SpreadsheetML.Sheet'/>" +
    "<input id='btnUpload_" + i + "' type='button' value='Upload' />" +
    "</div>"
  );

col.append(
    "<div><input id='fupFile_" + i + "' name='fupFile_" + i + "' type='file' accept='application/vnd.openxmlformats-officedocument.SpreadsheetML.Sheet'/>" +
    "<input id='btnUpload_" + i + "' name='btnUpload_" + i + "' type='button' value='Upload' />" +
    "</div>"
  );

【讨论】:

以上是关于如何使 ajaxfileupload 与动态生成的文件输入一起工作的主要内容,如果未能解决你的问题,请参考以下文章

动态生成选项时如何使默认值在选择上起作用? [复制]

jQuery插件ajaxfileupload.js源码与使用

ajaxFileUpload与KindEditor

ajaxFileUpload 怎么传相关参数到后台

反应:如何使输入仅与提供的文本量一样宽?

如何使 UIViewRepresentable @ViewBuilder 与动态内容一起使用?