Dropzone上传到Joomla

时间:2014-03-20 14:32:28

标签: php joomla joomla3.0 dropzone.js

我使用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();

我觉得我有点生气!

1 个答案:

答案 0 :(得分:0)

好的,所以确实是CORS。由于我的子域位于同一台服务器上,因此我使用Dropzone将文件上传到同一域(x.hr4.mdev)。我收到了服务器的响应,其中包含服务器文件系统中文件的位置。我能够用它来在hr4.mdev上实现所需的结果。