2016-08-23 113 views
0

这种形式我想发送使用ajax调用文件,但它不调用c#函数,并没有显示任何错误。ajax调用(发送文件)调用c#功能不工作(webmethod)

//form to submit 
<form id="formfile" enctype="multipart/form-data"> 
    <div class="modal-body"> 
     <input type="file" id="fileupload1"/> 
    </div> 
    <div class="modal-footer"> 
     <input type="submit" id="savefiles" class="buttonType" onclick="saveFile();return false" value="Save File" /> 
    </div> 
</form> 

这Ajax调用来调用C#代码,并发送文件(.PDF)

//ajax call in .aspx file 
function saveFile() { 
    debugger; 
    var file = $('input[type="file"]').val(); 
    var exts = ['pdf', 'PDF']; 

    var formData = new FormData(); 
    formData.append("imageFile", $('#fileupload1')[0].files[0]); 

    if (file) { 

     var extension = file.substring(file.lastIndexOf('.') + 1, file.length); 

     if ($.inArray(extension, exts) > -1) 
     { 
      //var formData = new FormData($('#form1')[0]); 
      var fileUpload = $('#fileupload1').get(0); 
      var files = fileUpload.files; 


      for (var i = 0; i < files.length; i++) { 
       formData.append(files[i].name, files[i]); 
      } 
      formData.append(fileUpload.name, fileUpload); 
      //alert('File Uploaded Successfully!'); 
     } 

     else 
     { 
      alert('Invalid file, Only pdf files can be uploaded!!!'); 
     } 
    } 
    //var str = "abc"; 
    $.ajax({ 
     url: "FileUploader.aspx/savepdfFiles", 
     type: "POST", 
     //cache: false, 
     contentType: false, 
     processData: false, 
     data: formData, 
     success: function (data) { 
      debugger; 

     }, 
     error: function (data) { 
      debugger 
     } 
    }); 
} 

它会接触到的成功部分还可以,但不能调用下面的方法。

//c# code 
[webMethod] 
public static void savepdfFiles() 
{ 
    //code 
} 

在ajax调用它会成功。但不调用savepdfFiles()方法。

+1

看一下,你写的是什么函数名称来调用 和你的函数名称是什么。 –

+0

对不起,实际上我是在尝试代码,这是为什么,但提交它会调用该方法。 –

+0

主要问题是它没有调用C#方法。 –

回答

0

我知道这个问题,很容易解决,只是你必须使用通用处理程序。 使用通用处理程序与您的AJAX调用,您可以发送任何文件到asp.net C#函数。 在通用处理程序中,您必须编写以下c#代码。

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

namespace UploadFile 
{ 
/// <summary> 
/// Summary description for UploadFileHandler 
/// </summary> 
public class UploadFileHandler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     //context.Response.ContentType = "text/plain"; 
     //context.Response.Write("Hello World"); 
     if (context.Request.Files.Count > 0) 
     { 
      HttpFileCollection files = context.Request.Files; 
      for (int i = 0; i < files.Count; i++) 
      { 
       HttpPostedFile file = files[i]; 
       string fname; 
       if (HttpContext.Current.Request.Browser.Browser.ToUpper() == "IE" || HttpContext.Current.Request.Browser.Browser.ToUpper() == "INTERNETEXPLORER") 
       { 
        string[] testfiles = file.FileName.Split(new char[] { '\\' }); 
        fname = testfiles[testfiles.Length - 1]; 
       } 
       else 
       { 
        fname = file.FileName; 
       } 
       fname = Path.Combine(context.Server.MapPath("~/Uploads/"), fname); 
       file.SaveAs(fname); 
      } 
     } 
     context.Response.ContentType = "text/plain"; 
     context.Response.Write("File Uploaded Successfully!"); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
} 

这里的例子...

如果你想完整的例子点击here

+0

这对我真的很有帮助... Thanksx –

0

编辑24/08/2016

您可以将您的BLOB数据立足64和JSON

var filesLength = 0; 
function SaveFileToTemp() { 

    var file = $('input[type="file"]').val(); 
    var exts = ['pdf', 'PDF']; 

    var pdfList = []; 
    // var pdfFile = { FileName: '', B64Data: '' }; 

    if (file) { 

     var extension = file.substring(file.lastIndexOf('.') + 1, file.length); 

     if ($.inArray(extension, exts) > -1) { 

      var fileUpload = $('#fileupload1').get(0); 
      var files = fileUpload.files; 

      filesLength = files.length; 
      for (var i = 0; i < files.length; i++) { 
       var reader = new window.FileReader(); 
       reader.myFileIndex = i; 
       reader.onloadend = function() { 
        base64data = reader.result; 
        pdfList.push({ FileName: files[this.myFileIndex].name, B64Data: base64data.substr(base64data.indexOf(',') + 1) }); 
        console.log(base64data); 
        filesLength--; 
        if (filesLength === 0) { 
         $.ajax({ 
          url: "/FileUploader.aspx/savepdfFiles", 
          type: "POST", 
          //cache: false, 
          contentType: "application/json; charset=utf-8", 
          dataType: "json", 
          data: JSON.stringify({ listPdf: pdfList }), 
          success: function (data) { 
           //alert('File Uploaded Successfully!'); 
           debugger; 
          }, 
          error: function (data) { 
           debugger 
          } 
         }); 
        } 
       } 
       reader.readAsDataURL(files[i]); 
      } 
     } 

     else { 
      alert('Invalid file, Only pdf files can be uploaded!!!'); 
     } 
    }   


} 

,并在C#中发送

[WebMethod] 
public static void savepdfFiles(List<PdfFile> listPdf) 
{ 
    //code 
    foreach (var item in listPdf) 
    { 
     byte[] data = Convert.FromBase64String(item.B64Data); 
     System.IO.File.WriteAllBytes(string.Format("d:\\temp\\{0}",item.FileName), data) ; 
    } 

} 

这是我的Clas Pdf文件信息

public class PdfFile 
{ 
    public string FileName { get; set; } 
    public string B64Data { get; set; } 
} 

也许你将它添加到你的web.config允许大JSON序列:

<system.web.extensions> 
    <scripting> 
     <webServices> 
     <jsonSerialization maxJsonLength="10240000"/> 
     </webServices> 
    </scripting> 
    </system.web.extensions> 

必须设置此时,相应的值maxJsonLength

以前的答案

我想我之前遇到过这个问题,我记得有一种机制不允许你这样做。

也许我错了,但我分享你一个link。 你将不得不用ashx来处理这个问题。

这里是一个内置保护功能的验证层ASP.NET 强制执行的GET和POST基于ASP.NET AJAX Web方法,这 是,无论HTTP动词的使用,ASP.NET总是 要求将HTTP Content-Type标头设置为值 application/json。它不会发送此内容类型标头,AJAX将拒绝服务器上的请求。

+0

是的,使用.ashx它工作正常,但我们只希望它在同一页。 –

+0

所以,如果我是正确的,你不能使用content-type = application/x-www-form-urlencoded或multipart/form-data – Mathieu

+0

这也不起作用。 –