2016-07-01 10 views
7

में खाली रहता है जब मुझे कोणीय नियंत्रक के साथ डेटा को धक्का देने का प्रयास होता है तो मुझे यहां कोई समस्या है। लेकिन मैं जो भी करता हूं (IFormFile फ़ाइल) हमेशा खाली रहता है। रेज़र सिंटैक्स के साथ केवल कुछ उदाहरण हैं लेकिन कोणीय या jquery के साथ ऐसा करने के लिए कोई उदाहरण नहीं है।IFormFile हमेशा Asp.Net कोर 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 ...; 
    } 

मैंने इसे फॉर्मडाटा के साथ करने की भी कोशिश की है, क्योंकि जब आप इसे रेजर सिंटैक्स के साथ पोस्ट करते हैं तो इसका निर्माण होता है। इस तरह कुछ:

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 
      } 

कच्चे फ़ाइल को प्रदान करने के लिए फॉर्मडाटा के बजाय टिप्पणी में लिखा गया था। लेकिन फिर भी कुछ नहीं होता

+0

यह मदद करेगा यदि आप साझा कर सकते हैं कि आपका अनुरोध निकाय कैसा दिखता है (मुझे पोस्ट की गई फ़ाइल सामग्री में दिलचस्पी नहीं है लेकिन बाकी सब कुछ)। आप इसे ब्राउज़र के डेवलपर टूल डायग्नोस्टिक्स से पकड़ सकते हैं। –

+0

यह जब यह rawfile है 'lastModified: 1461136463443 lastModifiedDate: बुध अप्रैल 20 वर्ष 2016 09:14:23 GMT + 0200 (डब्ल्यू यूरोप डेलाइट समय) नाम:" snip_20160420091420.png " का आकार: 3563 प्रकार:" छवि/पीएनजी " वेबकिटरेलिएटपैथ:" " और जब यह फॉर्म डेटा है, तो मैं इसे पढ़ नहीं सकता, यह सिर्फ '__proto __: फॉर्मडाटा' – 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