我目前的情况是:我正在做嵌套重复,如下所示:
$scope.uploadPic = function(file)
{
alert($scope.taskdetails.id); //task_id e.g 21
alert($rootScope.job_id); //job_id e.g 12
file.upload = Upload.upload(
{
url: 'http://localhost/mobile-data/upload_file.php',
data: {
file: file,
task_id: $scope.taskdetails.id,
job_id: $rootScope.job_id
},
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
}, function (evt) {
// Math.min is to fix IE which reports 200% sometimes
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
但在我的upload_file.php
我无法收到以下值:
task_id: $scope.taskdetails.id,
job_id: $rootScope.job_id
在console.log
他们工作正常。但在服务器端它没有收到。
这是我的upload_file.php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('content-type: application/json; charset=utf-8');
$_POST = json_decode(file_get_contents('php://input'), true);
$task_id = $_POST["task_id"];
$file = $_FILES["file"];
$job_id = $_POST["job_id"];
var_dump($task_id);
var_dump($job_id);
但在var_dump
上只会打印null
。帮助我正确接收值..
答案 0 :(得分:1)
您可以验证实际发送到服务器的内容吗? (您可以在大多数浏览器中使用F12开发工具执行此操作。)
data.file
的类型是什么?在查看你的php代码时,我假设你正在向服务器发送一个json对象,所以我猜测浏览器无法将file
序列化为json对象,并最终发送一个空请求给服务器。
要解决此问题,您可以将文件读取为base64数据,以便您可以将其作为字符串发送到json数据对象中:
var data = {
file: '',
task_id: $scope.taskdetails.id,
job_id: $rootScope.job_id
};
if($window.FileReader) {
var reader = new FileReader();
reader.onloadend = function() {
data.file = reader.result;
$http.post('http://localhost/mobile-data/upload_file.php', data);
}
reader.readAsDataURL(file);
}
然后该文件将作为格式为data:image/png;base64,...
的字符串发送到服务器(您可以在F12工具中看到这一点)。
到了php,这个base64字符串需要被解码才能找回文件:
$_POST = json_decode(file_get_contents('php://input'), true);
$task_id = $_POST['task_id'];
$job_id = $_POST['job_id'];
if(isset($_POST['file']) && ($_POST['file'] != NULL)
&& preg_match('/data:([^;]*);base64,(.*)/', $_POST['file'], $matches)) {
if($matches && (count($matches) > 2)) {
$datatype = $matches[1];
$file = base64_decode($matches[2]);
}
}
注意,当您将数据作为json对象发送到服务器时,$_FILES
无法正常工作。
编辑:刚刚注意到您正在使用ng-file-upload?然后数据不会作为json对象发送,而是作为通常的形式urlencoded数据。在这种情况下,你不应该在你的PHP代码中有这一行:
$_POST = json_decode(file_get_contents('php://input'), true);
并以javascript发送数据:
Upload.upload({
url: 'http://localhost/mobile-data/upload_file.php',
method: 'POST',
file: file,
sendFieldsAs: 'form',
fields: {
task_id: $scope.taskdetails.id,
job_id: $rootScope.job_id
}
})