上传文件没有出现在 $_POST 或 $_FILES 中,只有 $HTTP_RAW_POST_DATA
Upload file does not show up in $_POST or $_FILES, only $HTTP_RAW_POST_DATA
我正在尝试向我的 Drupal 6 自定义模块添加异步上传。但问题是,当上传发生时(我的 php 函数有一个断点)在 $_POST 或 $_FILES 中看不到任何数据。文件的所有数据都被放入 $HTTP_RAW_POST_DATA。我希望它在 $_FILES 数组中。谁能告诉我我做错了什么。或者至少如何使用 $HTTP_RAW_POST_DATA 在后端处理文件。这是我的代码:
在my_module_viewer.views.inc
<form id='my_upload_form' enctype='multipart/form-data' method='POST'>
<input type='file' name= 'file_upload' id= 'file_upload' multiple>
<input type='button' name ='file_upload_button' id ='file_upload_button' value= 'Upload' />
</form>
Java 脚本:
$('#file_upload_button').click(function(){
var files = $( '#file_upload' )[0];
var data = new FormData();
jQuery.each(files.files, function(i, file) {
data.append('file-'+i, file);
});
var request_timeout = 50000;
var url = Drupal.settings.basePath + 'my_module/cases/add_attachment';
$.ajax({
url: url,
data:data,
cache: false,
contentType: false,
processData: false,
type: 'POST',
beforeSend: function(xhr ){
$.blockUI({
message: "Uploading File. Please Wait.",
css: {
border: 'none',
padding: '15px',
backgroundColor: '#333',
'-webkit-border-radius': '10px',
'-moz-border-radius': '10px',
opacity: .9,
color: '#fff',
fontSize: '26px',
fontFamily: "'Helvetica Neue', Helvetica"
}
});
},success: function(data) {
$.unblockUI();
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
$.unblockUI();
}
});
});
正如我提到的,这是用 Drupal 6 编写的。我不确定这是否相关,但这是我的任务菜单:
发现于 my_module.module
$items['my_module/cases/add_attachment']= array(
'page callback' => 'add_attachment',
'access arguments' => array('add attachment for user'),
'type' => MENU_CALLBACK,
'access callback' => true,
'file' => 'my_module_viewer.views.inc'
);
不确定这是浏览器问题还是什么,但我最终改用了 XHR。像这样:
$('#file_upload_button').click(function(){
var files = $( '#file_upload' )[0];
var data = new FormData();
var url = "myPath";
var xhr = new XMLHttpRequest();
var fileCount = 0;
jQuery.each(files.files, function (i, file) {
data.append('file-' + i, file)
fileCount++;
});
if (fileCount > 0) {
xhr.open('POST', url, true);
xhr.upload.onprogress = function(e) {
};
xhr.upload.onerror = function(e){
$.unblockUI();
};
xhr.upload.onloadstart = function(e){
showBlockUI("Uploading Files...")
};
xhr.addEventListener('readystatechange', function(e) {
if( this.readyState === 4 ) {
var result = this.responseText;
if(result){
result = JSON.parse(result);
}
}
$( '#file_upload').val(null);
$.unblockUI();
}
});
xhr.send(data);
}
return false;
});
我正在尝试向我的 Drupal 6 自定义模块添加异步上传。但问题是,当上传发生时(我的 php 函数有一个断点)在 $_POST 或 $_FILES 中看不到任何数据。文件的所有数据都被放入 $HTTP_RAW_POST_DATA。我希望它在 $_FILES 数组中。谁能告诉我我做错了什么。或者至少如何使用 $HTTP_RAW_POST_DATA 在后端处理文件。这是我的代码:
在my_module_viewer.views.inc
<form id='my_upload_form' enctype='multipart/form-data' method='POST'>
<input type='file' name= 'file_upload' id= 'file_upload' multiple>
<input type='button' name ='file_upload_button' id ='file_upload_button' value= 'Upload' />
</form>
Java 脚本:
$('#file_upload_button').click(function(){
var files = $( '#file_upload' )[0];
var data = new FormData();
jQuery.each(files.files, function(i, file) {
data.append('file-'+i, file);
});
var request_timeout = 50000;
var url = Drupal.settings.basePath + 'my_module/cases/add_attachment';
$.ajax({
url: url,
data:data,
cache: false,
contentType: false,
processData: false,
type: 'POST',
beforeSend: function(xhr ){
$.blockUI({
message: "Uploading File. Please Wait.",
css: {
border: 'none',
padding: '15px',
backgroundColor: '#333',
'-webkit-border-radius': '10px',
'-moz-border-radius': '10px',
opacity: .9,
color: '#fff',
fontSize: '26px',
fontFamily: "'Helvetica Neue', Helvetica"
}
});
},success: function(data) {
$.unblockUI();
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
$.unblockUI();
}
});
});
正如我提到的,这是用 Drupal 6 编写的。我不确定这是否相关,但这是我的任务菜单:
发现于 my_module.module
$items['my_module/cases/add_attachment']= array(
'page callback' => 'add_attachment',
'access arguments' => array('add attachment for user'),
'type' => MENU_CALLBACK,
'access callback' => true,
'file' => 'my_module_viewer.views.inc'
);
不确定这是浏览器问题还是什么,但我最终改用了 XHR。像这样:
$('#file_upload_button').click(function(){
var files = $( '#file_upload' )[0];
var data = new FormData();
var url = "myPath";
var xhr = new XMLHttpRequest();
var fileCount = 0;
jQuery.each(files.files, function (i, file) {
data.append('file-' + i, file)
fileCount++;
});
if (fileCount > 0) {
xhr.open('POST', url, true);
xhr.upload.onprogress = function(e) {
};
xhr.upload.onerror = function(e){
$.unblockUI();
};
xhr.upload.onloadstart = function(e){
showBlockUI("Uploading Files...")
};
xhr.addEventListener('readystatechange', function(e) {
if( this.readyState === 4 ) {
var result = this.responseText;
if(result){
result = JSON.parse(result);
}
}
$( '#file_upload').val(null);
$.unblockUI();
}
});
xhr.send(data);
}
return false;
});