繁体   English   中英

Dropzone上传到Joomla

[英]Dropzone upload to Joomla

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

我想我有点生气!

好的,的确是CORS。 由于我的子域位于同一服务器上,因此我使用Dropzone将文件上传到同一域(x.hr4.mdev)。 我从服务器返回响应,该响应包含服务器文件系统中文件的位置。 我能够使用它在hr4.mdev上获得所需的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM