【问题标题】:my file upload stopped working我的文件上传停止工作
【发布时间】:2017-01-18 16:02:11
【问题描述】:

我正在上传文件,我的代码对于上传是正确的。

这个例子几乎就是我正在做的:https://stackoverflow.com/a/15680783/5874935

但是,我的项目出了点问题,突然停止工作。我一直在努力解决这个问题,但无济于事。我最近用这个函数转换成单页应用提交表单:

 var ajaxFormSubmit = function (contentDiv, formDiv, modalId, formId, controllerPath) {
         $(".loader").show();
         $("#".concat(formId)).on("submit", function (e) {
             console.log("ajax form submitted");
             e.preventDefault();  // prevent standard form submission
             var form = $(this);
             $.ajax({
                 url: form.attr("action"),
                 method: form.attr("method"),  // post
                 data: form.serialize(),
                 error: function () {
                     $(".loader").hide();
                     alert("An error occurred.");
                 },
                 success: function (partialResult) {
                     console.log(partialResult.length);

                     if (partialResult.length === 0) {
                         console.log("form archhived");
                         $("#".concat(modalId)).modal('hide');
                         //forcing the backdrop to go away, something is wrong with the modal, it needs work.
                         $('.modal-backdrop').remove();
                         getManager(controllerPath, contentDiv);
                         //get gunnery manager
                     }
                     else {
                         console.log("form came back");
                         $("#".concat(formDiv)).html(partialResult);
                         $(".loader").hide();

                     }
                 }
             });
         });
     }

型号:

public class person 
{
public int id {get;set;}
public string fName {get;set;}
public string lName {get;set;}
public HttpPostedFileBase attachment {get;set;}
}

这是我的控制器部分:

if (model.attachment != null)
                {
                    var file = model.attachment;
                        if (file.ContentLength > 0)
                        {

                            var path = Path.Combine(Server.MapPath("~/App_Data/uploads"),Path.GetFileName(file.FileName));
                        file.SaveAs(path);
                        System.Diagnostics.Debug.WriteLine(path);
                        model.attachmentLink = path;
                    }

            }

我发现我的文件上传在这个时候停止工作并不是巧合,但我现在才注意到。如何使我的文件上传工作?

注意 该视图使用 html 助手非常标准。

【问题讨论】:

  • 以前是否使用过 $,ajax?或者当您添加 $.ajax 时它停止工作。据我所知,除非您使用 FormData,否则您无法使用 AJAX 上传文件。
  • 当我添加 AJAX 时停止了,我想。我最初使用的是 HTTP 帖子
  • 这意味着您需要添加表单数据才能使其工作
  • 我的 html 助手中的 html.beginForm 中有 encType = "multipart/form-data"}
  • 您需要使用FormData(与encType = "multipart/form-data" 不同)并设置正确的ajax 选项才能使用ajax 上传文件。示例参考this answer

标签: jquery asp.net ajax asp.net-mvc form-data


【解决方案1】:

尝试使用FormData关注

var ajaxFormSubmit = function (contentDiv, formDiv, modalId, formId, controllerPath) {
             $(".loader").show();
             $("#".concat(formId)).on("submit", function (e) {
                 console.log("ajax form submitted");
                 e.preventDefault();  // prevent standard form submission
                 var form = $(this);
                 var formData = new FormData(); // CREATE FORM DATA OBJECT
                 var fileUpload = $("#file").get(0); // your file element
                 var files = fileUpload.files;
                 formData.append("YOR_FILE_DATA_KEY_NAME", files[0]);
                 // add all form elements like following
                // formData.append("key",value);
                   formData.append("id",$("#id").val()); // check the selector if it is correct
                   formData.append("fName",$("#fName").val());
                   formData.append("lName",$("#lName").val());
                 $.ajax({
                     url: form.attr("action"),
                     method: "POST",  // post
                     contentType: false, // Not to set any content header
                     processData: false, // Not to process data
                     data: formData, // pass this form data instead of form.serialize()
                     error: function () {
                         $(".loader").hide();
                         alert("An error occurred.");
                     },
                     success: function (partialResult) {
                         console.log(partialResult.length);

                         if (partialResult.length === 0) {
                             console.log("form archhived");
                             $("#".concat(modalId)).modal('hide');
                             //forcing the backdrop to go away, something is wrong with the modal, it needs work.
                             $('.modal-backdrop').remove();
                             getManager(controllerPath, contentDiv);
                             //get gunnery manager
                         }
                         else {
                             console.log("form came back");
                             $("#".concat(formDiv)).html(partialResult);
                             $(".loader").hide();

                         }
                     }
                 });
             });
         }

编辑:将 form.seralize() 转换为 FormData 对象的解决方案

function ConvertToFormData(serializedArray, fileInputID)
{
var formData = new FormData();
//var serializedArray = $("form").serializeArray();
for(var i = 0; i < serializedArray.length;i++)
{
    if(serializedArray[i].name != "FILE_INPUT_ELEMENT") // don't add file input here
    formData.append(serializedArray[i].name,serializedArray[i].value);

}

var fileUpload = $(fileInputID).get(0); // your file element
                 var files = fileUpload.files;
                 formData.append(fileInputID, files[0]);
return formData;
}

这个功能怎么用???

var data = ConvertToFormData($("form").serializeArray(),"Your_file_input_id");

【讨论】:

  • 那么表单数据会做什么呢?它将允许此功能与我的所有其他形式一起使用吗?没见过
  • 如果您的表单中有文件上传,并且您需要通过 AJAX 发布该表单,您必须使用 FormData(),如果您的表单不包括文件上传,您现有的解决方案应该可以正常工作.如果您有很多带有文件上传的表单,我会建议在 javascript 中创建通用函数/实用程序来处理所有这些。
  • 查看本帖是否非法调用并处理错误stackoverflow.com/questions/10324594/jquery-illegal-invocation
  • 基本上,我有一个模型是一个注册应用程序,它有一个用户可以用它输入的图像。
  • 答案中的解决方案应该适用..只需检查并调试所有表单元素是否正确添加到 formdata 对象,并在提交时将数据发布到服务器
猜你喜欢
  • 2016-02-27
  • 2014-05-28
  • 2018-05-13
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2018-07-17
相关资源
最近更新 更多