ajax调用(发送文件)调用c#函数不工作(webmethod)

时间:2016-08-23 13:04:01

标签: c# jquery ajax

我希望使用带文件的ajax调用发送此表单,但它不调用c#函数而不显示任何错误。

//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()方法。

2 个答案:

答案 0 :(得分:0)

编辑2016年8月24日

您可以将blob数据转换为base 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 PdfFile for info

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标头设置为该值   应用程序/ JSON。它不会发送此内容类型标头,ASP.NET   AJAX将拒绝服务器上的请求。

答案 1 :(得分:0)

我知道这个问题并且只需要使用Generic Handler就可以轻松解决。 在AJAX调用中使用通用处理程序,您可以将任何文件发送到asp.net C#函数。 在Generic Handler中,您必须编写以下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