2016-08-23 55 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

這也不起作用。 –