2016-03-29 20 views
0

Bir projenin N katılımcısıyla kaydedilmesini sağlamak için bir formum var. Her katılımcının okul sertifikalarını göndermesi gereken bir alan eklemem istendi.
Sorun şu ki, bu alanı bir nesnenin içine eklediğimde, verileri artık PHP'ye gönderemiyorum.Bir nesnenin içine bir dosya göndermek için AngularJS kullanın

ben göndermek zorunda JSON aşağıdaki biçimdedir:

$http({ 
    method: "POST", 
    url: [SCRIPT], 
    headers: { 
     "Content-Type": undefined 
    }, 
    data: $scope.data, 
    transformRequest: function (data) { 
     var formData = new FormData(); 

     angular.forEach(data, function (value, key) { 
      formData.append(key, value); 
     }); 

     return formData; 
    } 
}).success(function(response) { 
    // do something 
}); 

Ve PHP'de

, bu benim fonksiyonudur:

{ 
    "description": [STRING], 
    "name": [STRING], 
    "objective": [STRING], 
    "participants": [NUMBER], 
    "regulament": [BOOLEAN], 
    "resume": [STRING], 
    "users": { 
     "1": { 
      "born": [DATE], 
      "educationCertificate": [OBJECT], // File 
      "email": [STRING], 
      "genre": [BOOLEAN], 
      "level": [NUMBER], 
      "name": [STRING], 
      "neighborhood": [STRING], 
      "phone": [STRING], 
      "school": [STRING], 
      "socialNumber": [STRING] 
     }, 
     . . . 
     "n": { 
      "born": [DATE], 
      "educationCertificate": [OBJECT (FILE)], 
      "email": [STRING], 
      "genre": [BOOLEAN], 
      "level": [NUMBER], 
      "name": [STRING], 
      "neighborhood": [STRING], 
      "phone": [STRING], 
      "school": [STRING], 
      "socialNumber": [STRING] 
     } 
    } 
} 

dosya göndermek için, benim $ http böyle görünüyordu angularjs tarafından gönderilen verileri almak:

function param() { 
    $array = array(); 
    $request = new stdClass(); 

    if (count($_GET) || count($_POST) || count($_FILES)) { 
     $request = json_decode(json_encode(array_merge($_GET, $_POST, $_FILES)), false); 
    } else { 
     $request = json_decode(file_get_contents("php://input")); 
    } 

    if ($request) { 
     $array = array_filter(array_map(function($data) { 
      return is_string($data) ? trim($data) : $data; 
     }, get_object_vars($request)), function($data) { 
      return is_string($data) ? strlen($data) : $data; 
     }); 
    } 

    return json_decode(json_encode($array), false); 
} 

/* In the script */ 
$request = param(); 

Ancak PHP geliyor verileri aşağıdaki gibidir:

{ 
    "description": [STRING], 
    "name": [STRING], 
    "objective": [STRING], 
    "participants": [NUMBER], 
    "regulament": [BOOLEAN], 
    "resume": [STRING], 
    "users": [STRING] // "[object Object]" 
} 

Hep kullanım "Content-Type": undefined yapılmış ama "Content-Type": "multipart/form-data" ve "Content-Type": "application/x-www-form-urlencoded;" kullanmayı denedik. Ama sonuç daha da kötü.

Bu sorunun nasıl çözüleceğini bilen var mı?

+0

Sen 'readAsDataURL() kullanabilirsiniz' (bu [SO söz] belirtildiği gibi http://stackoverflow.com/questions/6978156/get-base64-encode-file-data-from-input-form). Ayrıca tarayıcı desteğini geliştirmek için bir [Polyfill] (http://stackoverflow.com/questions/16712123/read-data-url-with-file-api-polyfill) bulunmaktadır. – AWolf

cevap

0

Yakın bir zamanda Google App Engine (Java) ve Servelet ile aynı sorunla karşılaştım. Benim durumum seninkiyle aynı. Kullanıcının 5 ek yükleyebileceği yer ve bu dosyaları başka bilgilerle yüklemem gerekiyor. Benim durumumda $ http işe yaramıyor. Her dosya eki için bireysel istekte bulundum. Sorununuza gerçek bir çözüm değil ama bu kesinlikle size yardımcı olacaktır.

var formData = new FormData(); 
formData.append('attachment',FILE_OBJECT); 
$.ajax({ 
    url: "URL", 
    type: "POST", 
    data: formData, 
    cache: false, 
    contentType: false, 
    processData: false, 
    xhr: function() { // Custom XMLHttpRequest 
     var myXhr = $.ajaxSettings.xhr(); 
     return myXhr; 
     }, 
    }).success(function(data) { 
     console.log("File uploaded successfully"); 
    }).error(function(data){ 
     console.log("Somwthing went wrong"); 
    }); 
+0

Kayıtları ayrı ayrı göndermem mümkün değil. Öncelikle proje verilerini veri tabanına kaydetmem gerekiyor, daha sonra katılımcıların verilerini proje kimliğiyle kaydetmeliyim. Son olarak, tüm verilerle bir PDF oluşturmalıyım. PDF için olmasa bile ayrı bir veri gönderebilirim. –

İlgili konular