我正在编写一个允许用户与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”的值。
答案 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;
?>