2016-12-14 2 views
1

Я искал в Интернете ищет ответ на эту проблему, но я не могу найти что-нибудь, что работает, у меня есть следующий код контроллера:MVC Jquery загрузки файлов Request.Files всегда пустой

[HttpPost] 
public ActionResult UploadFiles() 
{ 
    // If files exist 
    if (Request.Files != null && Request.Files.Count > 0) 
    { 
     // ** Do stuff 

     return Json(new { result = true, responseText = "File(s) uploaded successfully" }); 
    } 

    // Return no files selected 
    return Json(new { result = false, responseText = "No files selected" }); 
} 

И следующий код на моей странице cshtml, который отлично работает и контроллер может видеть файлы, которые я загрузить:

<input type="file" name="files" id="files" accept="image/*;capture=camera" multiple> 
<button type="button" onclick="submitform()">Submit</button> 

<script> 
    function submitform(){ 

     // Get files from upload 
     var files = $("#files").get(0).files; 

     // Create form data object 
     var fileData = new FormData(); 

     // Loop over all files and add it to FormData object 
     for (var i = 0; i < files.length; i++) { 
      fileData.append(files[i].name, files[i]); 
     } 

     // Send files to controller 
     var xhr = new XMLHttpRequest(); 
     xhr.open("POST", "/Quotes/QuoteFiles/UploadFiles", false); 
     xhr.send(fileData);  
    } 

</script> 

Однако, когда я пытаюсь изменить эту работу, используя вызов Ajax, как показано ниже, затем Request.Files в контроллере всегда нет файлов. Бит только я изменил это «Отправить файлы на контроллер» часть:

<input type="file" name="files" id="files" accept="image/*;capture=camera" multiple> 
<button type="button" onclick="submitform()">Submit</button> 

<script> 
    function submitform(){ 

     // Get files from upload 
     var files = $("#files").get(0).files; 

     // Create form data object 
     var fileData = new FormData(); 

     // Loop over all files and add it to FormData object 
     for (var i = 0; i < files.length; i++) { 
      fileData.append(files[i].name, files[i]); 
     } 

     // Send files to controller 
     $.ajax({ 
      url: '/Quotes/QuoteFiles/UploadFiles', 
      type: "POST", 
      contentType: false, // Not to set any content header 
      processData: false, // Not to process data 
      data: fileData, 
      success: function (result) { 
       alert(result); 
      }, 
      error: function (err) { 
       alert(err.statusText); 
      } 
     }); 

    } 

</script> 

Я бег это в Google Chrome, но я попробовал IE 11 и края, но не их работу. Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

есть ли какие-либо сообщения об ошибках, зарегистрированные в 'console'? Что возвращает строку как ответ' JSON'? – guest271314

+0

Я не думаю, что вы можете загружать файлы с помощью ajax, вы можете сделать это с помощью iframe для имитации эффекта – AbdulHamid

+1

@AbdulHamid Файлы могут быть загружены с помощью '$ .ajax()' – guest271314

ответ

0

попробуйте использовать fileReader вместо formData и измените тип mimetype на 'text/plain; Charset = х-определяемый пользователем двоичный»

https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications#Example_Uploading_a_user-selected_file

+0

Что такое проблема с 'javascript' на вопрос? – guest271314

+0

@AbdulHamid пример, который вы предоставили относительно использования fileReader, не делает это асинхронно с использованием Ajax, с которым я столкнулся. – trfletch

0

я, наконец, нашел то, что было причиной этого вопроса, я следующий код на моей странице _Layout.cshtml которая там автоматически отправлять AntiForgeryToken на любой ajax-запросы, которые я делаю, это, как представляется, вызывает проблему, поскольку, как только я удаляю его, Request.Files не пуст. Теперь мне нужно, чтобы увидеть, если я могу найти способ, чтобы добавить этот код обратно в том, где это не остановит загрузку файлов работает:

$(document).ready(function() { 
    var securityToken = $('[name=__RequestVerificationToken]').val(); 
    $(document).ajaxSend(function (event, request, opt) { 
     if (opt.hasContent && securityToken) { // handle all verbs with content 
      var tokenParam = "__RequestVerificationToken=" + encodeURIComponent(securityToken); 
      opt.data = opt.data ? [opt.data, tokenParam].join("&") : tokenParam; 
      // ensure Content-Type header is present! 
      if (opt.contentType !== false || event.contentType) { 
       request.setRequestHeader("Content-Type", opt.contentType); 
      } 
     } 
    }); 
}); 

**** EDIT ****

Я теперь переработан это, как показано ниже, чтобы добавить «если (opt.data =„[объект FormData]“!», который решает проблему, не называя код, если это загрузить файл:

$(document).ready(function() { 
    var securityToken = $('[name=__RequestVerificationToken]').val(); 
    $(document).ajaxSend(function (event, request, opt) { 
     if (opt.hasContent && securityToken) { // handle all verbs with content 
      // If not "FormData" (i.e. not a file upload) 
      if (opt.data != "[object FormData]") 
      { 
       var tokenParam = "__RequestVerificationToken=" + encodeURIComponent(securityToken); 
       opt.data = opt.data ? [opt.data, tokenParam].join("&") : tokenParam; 
       // ensure Content-Type header is present! 
       if (opt.contentType !== false || event.contentType) { 
        request.setRequestHeader("Content-Type", opt.contentType); 
       } 
      } 

     } 
    }); 
}); 
Смежные вопросы