【问题标题】:file upload using jquery ajax and asp.net handler使用 jquery ajax 和 asp.net 处理程序上传文件
【发布时间】:2013-06-11 03:42:09
【问题描述】:

我正在努力让它工作,但我在上传文件时遇到错误。

ASPX

<asp:FileUpload ID="FileUpload1" runat="server" CssClass="file-upload-dialog" />
<asp:Button runat="server" ID="btnUpload" CssClass="btn upload" Text="Upload" />

处理程序

public void ProcessRequest(HttpContext context)
      {
            context.Response.ContentType = "multipart/form-data";
            context.Response.Expires = -1;
            try
            {
                  HttpPostedFile postedFile = context.Request.Files["file"];
                  string savepath = HttpContext.Current.Server.MapPath("~/assets/common/CompetitionEntryImages/");
                  var extension = Path.GetExtension(postedFile.FileName);

                  if (!Directory.Exists(savepath))
                        Directory.CreateDirectory(savepath);

                  var id = Guid.NewGuid() + extension;
                  if (extension != null)
                  {
                        var fileLocation = string.Format("{0}/{1}",
                                                         savepath,
                                                         id);

                        postedFile.SaveAs(fileLocation);
                        context.Response.Write(fileLocation);
                        context.Response.StatusCode = 200;
                  }
            }
            catch (Exception ex)
            {
                  context.Response.Write("Error: " + ex.Message);
            }
      }

jQuery

$(document).ready(function () {
            email = $("input[id$='emailHV']").val();
            alert(email);
            $('#aspnetForm').attr("enctype", "multipart/form-data");
      });



$('#<%= btnUpload.ClientID %>').on('click', function (e) {
            e.preventDefault();
            var fileInput = $('#ctl00_PageContent_Signup_ctl06_MWFileUpload_FileUpload1');
            var fd = new window.FormData();
            fd.append('file', fileInput.files[0]);

            $.ajax({
                  url: '/charity-challenge/MWFileUploadHandler.ashx',
                  data: fd,
                  processData: false,
                  contentType: false,
                  type: 'POST',
                  success: function (data) {
                        alert(data);
                  }
            });
      });

错误

HTML

<input type="file" name="ctl00$PageContent$Signup$ctl06$MWFileUpload$FileUpload1" id="ctl00_PageContent_Signup_ctl06_MWFileUpload_FileUpload1" class="file-upload-dialog">

 <input type="submit" name="ctl00$PageContent$Signup$ctl06$MWFileUpload$btnUpload" 
value="Upload" onclick="javascript:WebForm_DoPostBackWithOptions(new 
WebForm_PostBackOptions(&quot;ctl00$PageContent$Signup$ctl06$MWFileUpload$btnUpload&quot;, 
&quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" 
id="ctl00_PageContent_Signup_ctl06_MWFileUpload_btnUpload" class="button">

编辑

最后,我通过做这些事情来形成数据来让它工作

var fileData = fileInput.prop("files")[0];   // Getting the properties of file from file field
        var formData = new window.FormData();                  // Creating object of FormData class
        formData.append("file", fileData); // Appending parameter named file with properties of file_field to form_data
        formData.append("user_email", email);

完整的工作代码

$('#<%= btnUpload.ClientID %>').on('click', function (e) {
            e.preventDefault();
            var fileInput = $('#<%= FileUpload1.ClientID %>');
            var fileData = fileInput.prop("files")[0];   // Getting the properties of file from file field
            var formData = new window.FormData();                  // Creating object of FormData class
            formData.append("file", fileData); // Appending parameter named file with properties of file_field to form_data
            formData.append("user_email", email);
            $.ajax({
                  url: '/charity-challenge/MWFileUploadHandler.ashx',
                  data: formData,
                  processData: false,
                  contentType: false,
                  type: 'POST',
                  success: function (data) {
                        var obj = $.parseJSON(data);
                        if (obj.StatusCode == "OK") {
                              $('#<%= imagePath.ClientID %>').val(obj.ImageUploadPath);
                              $('.result-message').html(obj.Message).show();
                        } else if (obj.StatusCode == "ERROR") {
                              $('.result-message').html(obj.Message).show();
                        }
                  },
                  error: function (errorData) {
                        $('.result-message').html("there was a problem uploading the file.").show();
                  }
            });
      });

【问题讨论】:

  • 你能把&lt;asp:FileUpload ID="FileUpload1" runat="server" CssClass="file-upload-dialog" /&gt;生成的HTML贴出来。此外,在控制台选项卡中,您可以键入 var fileInput = $("#file-upload") 并检查它的值
  • 请查看我的编辑...
  • 它在控制台中显示未定义.. 我不知道为什么
  • 是的!您正在寻找一个 ID 为 file-upload 的元素。生成的 html 上没有具有此 id 的元素。试试 DaveHogan 的小贴士。
  • 尝试了没有运气的解决方案......仍然是同样的错误

标签: asp.net jquery file-upload ashx


【解决方案1】:

你可以用这个:

$("#<% = FileUpload1.clientID %>")

【讨论】:

    【解决方案2】:

    在您的网络配置文件中使用它

    <system.webServer>
     <validation validateIntegratedModeConfiguration="false" />
    <handlers>
        <add name="AjaxFileUploadHandler" verb="*" 
          path="AjaxFileUploadHandler.axd"
          type="AjaxControlToolkit.AjaxFileUploadHandler, 
          AjaxControlToolkit"/>
    </handlers>
    

    【讨论】:

      【解决方案3】:

      在敲了一个下午之后,当我意识到您指定了“处理程序”而不是“服务”时,我回到了这个问题/解决方案。 :) 另外,对于可以在后面运行此 jquery 的工作处理程序,我去了https://github.com/superquinho/jQuery-File-Upload-ASPnet 并删除了我不需要的内容。这是我正在使用的处理程序代码(VS2012)。如您所见,我现在仅将其用于 csv 上传。

      Imports System
      Imports System.Web
      Imports System.Data
      
      Public Class FileUpload : Implements IHttpHandler, IReadOnlySessionState
          Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
              Try
                  Select Case context.Request.HttpMethod
                      Case "POST"
                          Uploadfile(context)
                          Return
      
                  Case Else
                      context.Response.ClearHeaders()
                      context.Response.StatusCode = 405
                      Return
              End Select
      
          Catch ex As Exception
              Throw
          End Try
      
      End Sub
      
      Private Sub Uploadfile(ByVal context As HttpContext)
      
          Dim i As Integer
          Dim files As String()
          Dim savedFileName As String = String.Empty
          Dim js As New Script.Serialization.JavaScriptSerializer
      
          Try
      
              If context.Request.Files.Count >= 1 Then
      
                  Dim maximumFileSize As Integer = ConfigurationManager.AppSettings("UploadFilesMaximumFileSize")
      
                  context.Response.ContentType = "text/plain"
                  For i = 0 To context.Request.Files.Count - 1
                      Dim hpf As HttpPostedFile
                      Dim FileName As String
                      hpf = context.Request.Files.Item(i)
      
                      If HttpContext.Current.Request.Browser.Browser.ToUpper = "IE" Then
                          files = hpf.FileName.Split(CChar("\\"))
                          FileName = files(files.Length - 1)
                      Else
                          FileName = hpf.FileName
                      End If
      
      
                      If hpf.ContentLength >= 0 And (hpf.ContentLength <= maximumFileSize * 1000 Or maximumFileSize = 0) Then
                          Dim d As Date = Now
                          savedFileName = HttpRuntime.AppDomainAppPath & "CSVLoad\" + d.Year.ToString + d.DayOfYear.ToString + d.Hour.ToString + d.Minute.ToString + d.Second.ToString + d.Millisecond.ToString + ".csv"
      
                          hpf.SaveAs(savedFileName)
      
                      Else
      
                      End If
                  Next
      
              End If
      
          Catch ex As Exception
              Throw
          End Try
      
      End Sub
      
      Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
          Get
              Return False
          End Get
      End Property
      
      End Class
      

      【讨论】:

        【解决方案4】:
        $("#file-upload") 
        

        应该是

        $("#ctl00_PageContent_Signup_ctl06_MWFileUpload_file-Upload")
        

        查看使用ClientIdMode 属性将服务器代码上的文件上传控件更改为具有静态服务器端ID。像这样:

        <asp:FileUpload ID="FileUpload1" runat="server" CssClass="file-upload-dialog" ClientIdMode="Static" />
        

        那么就可以确定客户端代码中控件的ID是FileUpload1

        【讨论】:

        • 尝试在 html 中通过 jquery 处理生成的 id .. 仍然没有运气.. 同样的错误
        • 诀窍是使用静态的 ClientIDMode,这样您就可以确保元素客户端 ID 匹配。 (与按钮控件相同)。
        • 是的,这是真的,但我不能这样做,因为它可能会导致其他问题。但是我在 jquery 中输入了相同的 id 那么为什么我会收到错误消息?
        • 确保 ID 绝对匹配,并在您的浏览器监视/控制台窗口中确认 var fileInput 的结果。如果 ID 存在,那么您将不会得到“未定义”。
        • 请查看我的编辑...我通过将文件数据附加到表单对象来使其工作
        猜你喜欢
        • 1970-01-01
        • 2013-06-02
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 2013-02-20
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多