无法从动态生成的文件上传控件中保存文件

Posted

技术标签:

【中文标题】无法从动态生成的文件上传控件中保存文件【英文标题】:Not able to save file from dynamically generated fileupload controls 【发布时间】:2013-09-27 06:34:46 【问题描述】:

我有一个项目,其中文件上传控件是动态生成的。使用 Json,我试图将文件异步保存在目录中。我想在 asp.net 4.0 中使用处理程序模板保存带有文件名的文件。

        $.ajax(
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: Sitepath + "Handler/FileUploader.ashx?filename="+strfiles,
        secureuri: false,
        fileElementClass: "multi",
        dataType: "json",
        async: false
    );

我在 FileUploader 类之外添加了 HTTPPostedFile 的逻辑,因为它会在其中引发错误。

public class FileUploader : IHttpHandler, IRequiresSessionState

public void ProcessRequest(HttpContext context)

    string rt = "";


    HttpContext.Current.Response.ContentType = "text/html";
    string urlresponse = HttpContext.Current.Request.Url.ToString();
    string tempfiles = "";
    string filenames = "";
    int convert = urlresponse.IndexOf(",");
    urlresponse = urlresponse.Substring(convert + 1);
    string[] filesArray = urlresponse.Split(',');
    for (int i = 0; i < filesArray.Length; i++)
    
        tempfiles = filesArray[i].ToString();
        int lstIndex=tempfiles.LastIndexOf("\\");
        filenames = filenames + "," + tempfiles.Substring(lstIndex + 1);
    
    filenames = filenames.Substring(filenames.IndexOf(',') + 1);





    HttpFileCollection uploads = HttpContext.Current.Request.Files;
   string b = HttpContext.Current.Request.Url.ToString();

    Hashtable hashtable = new Hashtable();

    // Declare variable
    string OrderFileName = String.Empty;
    string OrderIDs =String.Empty;
    string TempFolder = String.Empty;

    if (HttpContext.Current.Session["OrderID"] != null)
    

        OrderIDs = HttpContext.Current.Session["OrderID"].ToString();

        string mapPath = HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["DocPath"].ToString());

        string mapPathUserId = mapPath + "\\" + HttpContext.Current.Session["UserID"];
      ///
        var g = filenames.Split(',');

        for (int t = 0; t < g.Length;t++ )
        

           var h = g[t];
           rt = filesArray[t].ToString();

            if (Directory.Exists(mapPathUserId) == false)
            
                Directory.CreateDirectory(mapPathUserId);
            
            string mapPathCount = mapPathUserId + "/" + OrderIDs;
            if (Directory.Exists(mapPathCount) == false)
            
                //--------------Begin(Create Directory)----------------------------------------------------------------------------------//

                Directory.CreateDirectory(mapPathCount);

                //--------------End(Create Directory)----------------------------------------------------------------------------------//

            
            TempFolder = mapPathUserId + "/" + "Temp";

            if (Directory.Exists(TempFolder) == false)
            
                //--------------Begin(Create Directory for  temp folder)----------------------------------------------------------------------------------//

                Directory.CreateDirectory(TempFolder);

                //--------------End(Create Directoryfor temp folder)----------------------------------------------------------------------------------//

            

            OrderFileName = h;
            hashtable.Add(t.ToString(), OrderFileName);

            var see = HttpContext.Current.Server.MapPath(TempFolder + "/" + OrderFileName);
        

现在,路径已成功创建,但文件未保存在指定目录中。我保存文件的代码:

   for (int i = 0; i < uploads.Count; i++)
        
            HttpPostedFile upload = uploads[i];

            if (Directory.Exists(mapPathUserId) == false)
            
                Directory.CreateDirectory(mapPathUserId);
            

            string mapPathCount = mapPathUserId + "/" + OrderIDs;


            if (Directory.Exists(mapPathCount) == false)
            
                //--------------Begin(Create Directory)----------------------------------------------------------------------------------//

                Directory.CreateDirectory(mapPathCount);

                //--------------End(Create Directory)----------------------------------------------------------------------------------//

            

            /// Create Path for Temp Folder


            TempFolder = mapPathUserId + "/" + "Temp";

            if (Directory.Exists(TempFolder) == false)
            
                //--------------Begin(Create Directory for  temp folder)----------------------------------------------------------------------------------//

                Directory.CreateDirectory(TempFolder);

                //--------------End(Create Directoryfor temp folder)----------------------------------------------------------------------------------//

            

            if (upload.ContentLength > 0)
            

                if (upload.FileName.Contains(" "))
                
                    OrderFileName = upload.FileName.Replace(" ", "_");
                

                else
                
                    OrderFileName = upload.FileName;

                

                hashtable.Add(i.ToString(), OrderFileName);
                upload.SaveAs(TempFolder + "/" + OrderFileName);
            

        

请帮忙。

【问题讨论】:

【参考方案1】:

您必须确保通过正确的路径,在服务器中。我会尝试使用MapPath() 函数映射路径:

upload.SaveAs(Server.MapPath(TempFolder + "/" + OrderFileName));

【讨论】:

嘿,这是 HttpContext 的处理程序,对吧?我在变量 h 中添加文件集合。所以我想在不使用 HttpPostedFile 类的情况下保存这些文件。以下是设置路径的代码: var see = HttpContext.Current.Server.MapPath(TempFolder + "/" + OrderFileName);如果我可以在它之后保存它会很棒(但是 var h 不存在 SaveAs 方法): h.SaveAs(Server.MapPath(TempFolder + "/" + OrderFileName)); 我在任何地方都没有看到 var h?

以上是关于无法从动态生成的文件上传控件中保存文件的主要内容,如果未能解决你的问题,请参考以下文章

如何获取qt动态生成控件的数据

如何在 Matlab 中使用默认或动态生成的文件名进行保存? [复制]

用户控件,动态创建添加用户控件

无法从 localStorage 检索动态生成的内容

C#如何实现动态添加右键菜单

C#怎么给动态生成的控件(Textbox)赋值。