2016-08-23 6 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 
     } 
    }); 
} 

それは、次のメソッドを呼び出しても、成功のセクションに来るが、ではないでしょう。

ajaxコールでは、成功に入ります。 savepdfFiles()メソッドを呼び出すことはできません。

+1

あなたが呼び出すためにどの関数名を記述したか あなたの関数名は何ですか? –

+0

申し訳ありませんが、実際は私はそのコードを試していましたが、提出するとそのメソッドが呼び出されます。 –

+0

主な問題は、C#メソッドを呼び出さないことです。 –

答えて

0

私はこの問題を知っており、簡単に解決することができます。汎用ハンドラを使用するだけです。 AJAX呼び出しでジェネリックハンドラを使用すると、任意のファイルをasp.net C#関数に送信できます。 Generic Handlerでは、次のC#コードを記述する必要があります。あなたは完全な例クリックhereをしたい場合はここで

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; 
     } 
    } 
} 
} 

は...

例です!

+0

それは本当に私に役立つ... thankx –

0

EDIT 24/08/2016

あなたは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!!!'); 
     } 
    }   


} 

でそれを送信するためにあなたのBLOBデータを変換することができますし、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 PdfFile for info

public class PdfFile 
{ 
    public string FileName { get; set; } 
    public string B64Data { get; set; } 
} 
あなたはmaxJsonLength

は私が考える前答えをappropiate値を設定する必要が

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

はたぶん、あなたは大きなJSONのシリアル化を可能にするために、あなたのweb.configファイルにこれを追加する必要があります私はあなたにこれを許さない仕組みがあることを覚えているところから、この問題を抱えていました。

多分私は間違っていますが、私はあなたにlinkを共有しています。 これをashxで処理する必要があります。

ここでは、内蔵されたASP.NET が は関係なく、HTTP動詞のが使用されていることで両方GETとPOSTベースのASP.NET AJAXのWebメソッドのための強制保護の検証層、ASP.NET常に は、HTTP Content-Typeヘッダーが値 application/jsonに設定されている必要があります。このコンテンツタイプヘッダーは送信されません。ASP.NET AJAXはサーバー上の要求を拒否します。

+0

はい、.ashxを使用すると問題なく動作しますが、同じページでのみ必要です。 –

+0

私が正しいとしたら、content-type = application/x-www-form-urlencoded、multipart/form-data – Mathieu

+0

を使用することはできません。 –

関連する問題