我使用Dropzone将文件上传到Joomla:
// ...bunch of JS
this.buildUploader = function() {
var objThis = this;
if (typeof Dropzone != "undefined") {
Dropzone.autoDiscover = false;
this.dropZone = new Dropzone(this.fileSelect, {
url : location.protocol + '//' + document.domain,
autoProcessQueue : false,
success : this.fileUploaded.bind(objThis),
error: function(f, err) { console.log(err); },
addRemoveLinks : true,
sending: function(file, xhr, formData) {
formData.append("option", "com_hr4conduit");
formData.append("controller", "haf");
formData.append("task", "saveFile");
formData.append("s", document.getElementById('sid').value);
}
});
}
}
this.doFileUpload = function() {
console.log('do upload');
this.dropZone.processQueue();
}
它似乎运行良好,但它吐出错误"服务器响应0代码。"所以我猜这意味着服务器没有响应。我已经验证了网址是否正确。在服务器上我有一个名为com_hr4conduit的组件。我有一个名为haf的控制器,它有一个名为saveFile的方法:
public function saveFile() {
$storeFolder = 'images' . DS . 'attachments';
$dataOut = new stdClass;
$this->_arDebug[] = json_encode($_FILES);
if (!empty($_FILES)) {
$filename = $_FILES['file']['name'];
$tempFile = $_FILES['file']['tmp_name'];
$targetPath = JPATH_ROOT . DS . $storeFolder . DS;
$targetFile = $targetPath . $filename;
move_uploaded_file($tempFile, $targetFile);
$dataOut->fname = $filename;
} else {
$this->_arErr[] = "No files.";
}
$this->_dataOut($dataOut);
}
$ this-> _dataOut是一个私有函数,它使用_arDebug和_arErr吐出JSON响应;阻止Joomla吐出模板。
为了测试这一切,我在桌面上创建了一个名为delme.html的简单文件:
<html>
<body>
<form method="post" action="https://hr4.mdev/" enctype="multipart/form-data" >
<input type="hidden" name="s" value="*an authentication key*" />
<input type="hidden" name="option" value="com_hr4conduit" />
<input type="hidden" name="controller" value="haf" />
<input type="hidden" name="task" value="saveFile" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
hr4.mdev是我的VM上安装了Joomla的站点。这个表格很好用。这是一个CORS问题吗?我正在https://x.hr4.mdev/加载页面,并发布到https://hr4.mdev/。我发回适当的标题:
JResponse::clearHeaders();
JResponse::setHeader( 'Expires', 'Mon, 1 Jan 2001 00:00:00 GMT', true );
JResponse::setHeader( 'Last-Modified', gmdate("D, d M Y H:i:s") . ' GMT', true );
JResponse::setHeader( 'Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', false );
JResponse::setHeader( 'Access-Control-Allow-Origin', '*', false); // <- SEE!
JResponse::sendHeaders();
我觉得我有点生气!
答案 0 :(得分:0)