2016-03-30 2 views
0

У меня есть этот AJAXPOST запрос, исходящий AngularJS, в JSON модель с некоторыми полями и файл:Синтаксический FormData с PHP

------WebKitFormBoundarywlEiXuTa9EkwFUWz 
Content-Disposition: form-data; name="model" 

{"fname":"and","lname":"and","email":"[email protected]","phone":"+3912345","position":"Marketing","startdate":"10/10/2017"} 

------WebKitFormBoundarywlEiXuTa9EkwFUWz 

Content-Disposition: form-data; name="file"; filename="InterviewPreparation.pdf" 
Content-Type: application/pdf 

------WebKitFormBoundarywlEiXuTa9EkwFUWz-- 

Я разработчик PHP манекен. Как я могу разобрать запрос с помощью PHP? Этот код не работает:

<?php 
// mail.php 

$errors = array(); // array to hold validation errors 
$data = array();  // array to pass back data 

// validate the variables ======== 
if (empty($_POST['model.fname'])) 
    $errors['First name'] = 'Required.'; 
if (empty($_POST['model.lname'])) 
    $errors['Last Name'] = 'Required.'; 
if (empty($_POST['model.email'])) 
    $errors['Email'] = 'Required.'; 
if (empty($_POST['model.phone'])) 
    $errors['Phone'] = 'Required.'; 
if (empty($_POST['model.position'])) 
    $errors['Position'] = 'Required.'; 
if (empty($_POST['model.startdate'])) 
    $errors['Start Date'] = 'Required.'; 

// return a response ============== 
$file = $_POST['file']; 
if (! empty($file)) 
    echo 'Uploaded file: ' + $file.name; 

// response if there are errors 
if (! empty($errors)) { 
    // if there are items in our errors array, return those errors 
    $data['success'] = false; 
    $data['errors'] = $errors; 
} else { 
    // if there are no errors, return a message 
    $data['success'] = true; 
    $data['message'] = 'Mail sent, good luck!'; 
} 
// return all our data to an AJAX call 
echo json_encode($data); 
?> 
+0

Content-тип: многочастному/FormData с 2-мя атрибутами: «модель» является JSON и «файл» является файлом – epavan

ответ

0

Имя вашего первого поля форм-данных является «модель», она содержит JSON объект, который обрабатывается как строка в PHP, если вы не json_decode его первым.

Так что я предложил бы делать что-то вроде следующего:

$model = filter_input(INPUT_POST, 'model'); // better to not use $_POST directly 
$decoded = json_decode($model); 
if(!$decoded) 
    // not valid json 
if(empty($decoded->fname)) 
    $errors['First name'] = 'Required.'; 
// etc... 

Файл должен быть в массиве $ _FILES.

$file = $_FILES['file']; 
+0

Благодаря Brense, я борюсь с этим кодом. В вашем коде, если я echo $ model, я получаю null. Это означает, что я не могу получить параметр «модель» из запроса. Как я должен прочитать эти исходные данные POST на PHP? Как поток или что? Это сообщение с типом multipart/formdata Content-type. – epavan

+0

$ stream = fopen ('php: // input', 'rb'); $ string = stream_get_contents ($ stream); var_dump ($ string); // Этот дамп дает мне строку (0) "" – epavan

+0

Какой результат, если вы делаете 'var_dump ($ _ POST);'? данные формы не должны находиться во входном потоке. PHP автоматически добавляет поля формы к массиву $ _POST. – brense