2016-07-01 3 views
7

У меня возникла проблема, когда я пытаюсь нажать данные с помощью контроллера angularjs. Но то, что я делаю (файл IFormFile), всегда пуст. Есть только некоторые примеры с синтаксисом бритвы, но нет примеров, как это сделать с угловым или jquery.IFormFile всегда пуст в Asp.Net Core WebAPI

HTML:

<form class="form-body" enctype="multipart/form-data" name="newFileForm" ng-submit="vm.addFile()"><input type="file" id="file1" name="file" multiple ng-files="getTheFiles($files)"/></form> 

Директива:

(function() { 
'use strict'; 

angular 
    .module('app') 
    .directive('ngFiles', ['$parse', function ($parse) { 

    function fn_link(scope, element, attrs) { 
     var onChange = $parse(attrs.ngFiles); 
     element.on('change', function (event) { 
      onChange(scope, { $files: event.target.files }); 
     }); 
    }; 

    return { 
     link: fn_link 
    }; 
    }]); 
})(); 

Контроллер

var formdata = new FormData(); 
    $scope.getTheFiles = function ($files) { 
     angular.forEach($files, function (key, value) { 
      formdata.append(key, value); 
     }); 
    }; 

vm.addFile = function() {            
     var xhr = new XMLHttpRequest(); 
     xhr.open('POST', url, true); 
     xhr.setRequestHeader("Content-Type", "undefined"); 
     xhr.send(formdata);   
    } 

Asp.net ядро ​​WebAPI:

[HttpPost] 
    public async Task<IActionResult> PostProductProjectFile(IFormFile file) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     .... 
     return ...; 
    } 

Я также пытался сделать это с помощью formdata, поскольку он создается, когда вы публикуете его с синтаксисом бритвы. Что-то вроде этого:

dataService.addFile(formdata, { 
      contentDisposition: "form-data; name=\"files\"; filename=\"C:\\Users\\UserName\\Desktop\\snip_20160420091420.png\"", 
      contentType: "multipart/form-data", 
        headers: { 
         "Content-Disposition": "form-data; name=\"files\"; filename=\"C:\\Users\\UserName\\Desktop\\snip_20160420091420.png\"", 
         'Content-Type': "image/png" 
        }, 
        fileName: "C:\\Users\\UserName\\Desktop\\snip_20160420091420.png", 
        name: "files", 
        length : 3563 
      } 

Также вместо formData для предоставления необработанного файла, как я писал в комментарии. Но до сих пор ничего не происходит

+0

это поможет, если вы можете поделиться тем, как выглядит тело запроса (мне не интересно размещенное содержимое файла, но все остальное). Вы можете получить его из диагностической программы разработчика. –

+0

Это когда rawfile 'LastModified: 1461136463443 lastModifiedDate: ср 20 апреля 2016 9:14:23 GMT + 0200 (W. Europe летнее время) название: "snip_20160420091420.png" размер: 3563 типа:» image/png " webkitRelativePath:" "' И когда это данные формы, чем я не могу прочитать, это просто '__proto __: FormData' – error505

ответ

13

Это, как сделать это с angularjs:

vm.addFile = function() {      
       var fileUpload = $("#file").get(0); 
       var files = fileUpload.files; 
       var data = new FormData(); 
       for (var i = 0; i < files.length ; i++) { 
        data.append(files[i].name, files[i]); 
       } 


       $http.post("/api/Files/", data, { 
        headers: { 'Content-Type': undefined }, 
        transformRequest: angular.identity 
       }).success(function (data, status, headers, config) { 

       }).error(function (data, status, headers, config) { 

       }); 
} 

И в веб-Апи:

[HttpPost] 
public async Task<IActionResult> PostFile() 
{ 
//Read all files from angularjs FormData post request 
var files = Request.Form.Files; 
var strigValue = Request.Form.Keys; 
..... 
} 

Или так:

[HttpPost] 
    public async Task<IActionResult> PostFiles(IFormCollection collection) 
    { 
     var f = collection.Files;       

      foreach (var file in f) 
      { 
       //.... 
      }   
    } 
+0

Спасибо, работайте за меня !! – m2pathan

2

Вы можете сделать это также при загрузке кендо намного проще:

$("#files").kendoUpload({ 
     async: { 
      saveUrl: dataService.upload, 
      removeUrl: dataService.remove, 
      autoUpload: false            
     }, 
     success: onSuccess, 
     files: files 
    }); 
7

IFormFile будет работать только в том случае, если имя ввода совпадает с именем параметра метода. В вашем случае имя ввода - это «файлы», а имя параметра метода - «файл». Сделайте их одинаковыми, и они должны работать.

+0

Я пытался понять это часами, и для меня это был недостающий кусок. – Quanta

+0

Спасибо, чувак! Холли дерьмо боролась за это целую вечность. – Yodacheese

Смежные вопросы