通过Zoho Api异步上传文件

时间:2017-08-29 15:41:36

标签: javascript php ajax file zoho

我正在编写一个允许用户与Zoho CRM交互的网络应用,Zoho提供了我正在使用的api。他们说出于安全原因不允许AJAX请求,但我找到了一个解决方法,我向一个php文件发出一个AJAX请求,该文件使用cURL执行标准帖子并返回一个我可以在我的jQuery ajax中获取的值“成功的“处理程序,工作得很好。

我现在遇到的问题是如何使用AJAX上传api文件。我对网络上文件io的理解非常有限,我认为我所知的差距阻碍了我解决这个问题。因为它不是简单的文本和下拉输入,我正在通过我的AJAX调用,但相反文件,我有问题构建请求的URL。 api说参数应该是“FileInputStream”,但我只发现它存在于java中。我想保留PHP / JS中的所有内容。我真的不明白上传文件数据的位置,以及api如何工作,是否需要文件路径? BLOB?别的什么?

这是我到目前为止所拥有的 (主要HTML / PHP)

<div class="info_card" id="main-search">
<form id="myid" action="https://crm.zoho.com/crm/private/xml/Potentials/uploadFile?authtoken=AUTHTOKEN&scope=crmapi&id=ID" enctype="multipart/form-data" method="post">
<input type="file" id="fileInput" name="fileInput">
<input type="text" name="foo" id="foo" value="foofoo">
<button type="button" name="submit" id="ajaxSubmit">upload</button>
</form>
</div>
<script type="text/javascript">
$(function () {
    $("#ajaxSubmit").click( function () {
        console.log('clicked:');
        var fd = new FormData();

        fd.append( "fileInput", $("#fileInput")[0].files[0]);
        fd.append("foo", $("foo"));
        $.ajax({
            url: 'ajaxUpload.php',
            type: 'POST',
            cache: false,
            data: fd,
            processData: false,
            contentType: false,
            beforeSend: function () {
                console.log(("Uploading, please wait...."));
            },
            success: function (data) {
                console.log(("Upload success."));
                console.log(data);
            },
            complete: function () {
                console.log(("upload complete."));
            },
            error: function () {
                alert("ERROR in upload");
            }
        });

    });
});
</script>

(ajax处理php页面)

<?php
require_once($_SERVER[DOCUMENT_ROOT]."/models/zohoFunctions.php");
$url = "https://crm.zoho.com/crm/private/json/Potentials/uploadFile";
$params = "authtoken=AUTHTOKEN&scope=crmapi&id=ID&content=";
$params .= "@".$_FILES['fileInput'];
echo $params."\n";
echo makeURLRequest($url, $params);
 ?>

(该函数被称为“makeURLRequest”)

function makeURLRequest($url, $param){
  // Make the url request
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
  $result = curl_exec($ch);
  curl_close($ch);
  return $result;
}

如果我使用表单并将操作设置为zoho的api指定的基本URL,则文件上载工作正常。

我还将一些网址硬编码用于调试目的,我希望包含我的所有代码有助于显示我正在尝试实现的目标。

出于安全原因,已替换“authtoken”和“id”的值。

1 个答案:

答案 0 :(得分:-2)

感谢@PatrickQ,我能够解决问题,

通过在帖子数据字段中传递CURLFile对象&#34; content&#34;我能够让api高兴。在ajax方面我刚刚创建了一个FormData对象并将fileInput附加到它。这样,ajax处理php文件能够使用$ _FILE超全局来获取构建CURLFile对象所需的所有信息。

AJAX表单提交

// Form setup
<form id="myid" action="ajaxUpload.php" enctype="multipart/form-data" method="post">
<input type="file" id="fileInput" name="fileInput">
<button type="submit" name="submit" id="formSubmit">upload</button>
</form>

// AJAX submit function
$(function () {
    $("#formSubmit").click( function (e) {
        e.preventDefault(); 
        console.log('clicked:');
        var fd = new FormData();
        fd.append( "fileInput", $("#fileInput")[0].files[0]);
        $.ajax({
            url: 'ajaxUpload.php',
            type: 'POST',
            cache: false,
            data: fd,
            processData: false,
            contentType: false,
            beforeSend: function () {
                console.log(("Uploading, please wait...."));
            },
            success: function (data) {
                console.log(("Upload success."));
                console.log(data);
            },
            complete: function () {
                console.log(("upload complete."));
            },
            error: function () {
                alert("ERROR in upload");
            }
        });
    });
});

AJAX动作php文件

<?php
$file = $_FILES['fileInput'];
// base url
$url = "https://crm.zoho.com/crm/private/xml/Potentials/uploadFile";
$ch = curl_init();
$cfile = new CURLFile($file['tmp_name'],$file['type'],$file['name']);
$param = array(
  'authtoken' => AUTHTOKEN,
  'scope' => "crmapi",
  'id' => ID,
  'content' => $cfile
);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
?>