异步通过百会阿比
我正在写一个web应用程序,允许用户与Zoho CRM界面上载文件,百会提供的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>
(阿贾克斯处理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;
}
,如果我使用的格式,并把操作设置为基本URL塔文件上传作品就好t由zoho的api指定。
我也硬了一些网址,在调试的目的,我希望我所有的代码包含有助于展示一下我试图实现。
为“的authToken”和“ID”的值已替换为安全起见。
感谢@PatrickQ我是能够解决的问题,
通过传递一个CURLFile对象在后数据字段“内容”我能得到的API快乐。在事物的ajax方面,我创建了一个FormData对象并将fileInput附加到它。这样,处理php文件的ajax能够使用$ _FILE superglobal来获取构建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;
?>
看看这里第一:https://stackoverflow.com/questions/5392344/sending -multipart-formdata-with-jquery-ajax。我想知道“contentType:false”是否会成为问题。也许$(“#fileInput”)[0] .files [0]也是一个问题。看看他们如何处理它。我曾经有过类似的“旧的浏览器”解决方案的工作示例 –
嘿嘿,谢谢,我能得到FORMDATA工作,所以我得到了$ _FILE数据从我的主页传递给Ajax处理页面。但是我遇到的问题是在api调用中提交数据(文件数据)。 API说参数应该是“FileInputStream”,但每次我尝试构造一个请求URL时,我的参数是无效的。我想我不明白在请求url中应该传递什么。 [API_documentation](HTTPS://www.zoho。com/crm/help/api/uploadfile.html) –
您可能需要'“@”。$ _ FILES ['fileInput'] ['tmp_name']'。或者,您可以尝试发送[CURLFile](http://php.net/manual/en/curlfile.construct.php)对象。 –