这是我的问题。我有一个不太“用户友好”的票务跟踪系统,但我希望我的用户能够在不让他们看到它的情况下向系统提交“门票”。
我只使用自定义HTTP表单并发布到票证跟踪系统。一个问题是“成功/完成”页面有混淆人们的倾向。所以我认为......好吧,因为我无法更改票证系统以使用不同的“成功”页面。我将使用CURL处理HTTP Post交换并报告自定义成功或问题页面。下面是一些抽象的代码。
档案:tickethelper.php
<?php
extract($_POST);
$url = 'TICKETSYSTEMURL';
$fields = array(
'fullname'=>urlencode($fullname),
/*many more fields*/
);
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_MAXREDIRS, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
if((strlen(strstr($contents,'Your ticket has been submitted')))>0){
header("Location: http://THANKYOU");
}
else{
header("Location: http://OOPS");
}
?>
然而,我意识到我错过了我的文件上传。我见过的大多数CURL示例都是将本地文件上传到远程HTTP POST页面。
如何处理从我的用户HTTP表单接收文件,在'tickethelper'处理此文件并将其发送到'TICKETSYSTEMURL'?
- 以色列
答案 0 :(得分:1)
好吧,我不能说我自己做了这个,但是根据关于CURL和文件处理的PHP文档(PHP.net)
CURLOPT_INFILE |上传时应从中读取传输的文件。
value应该是一个流资源(例如,使用fopen())以获取option参数的以下值:
您应该可以在已上传的文件上调用fopen()
(请参阅有关Handling File Uploads的文档)我不确定,但您可能需要致电move_uploaded_file()
在调用fopen()
例如:
$ch = curl_init();
$file = fopen($_FILES['file-field-name']['tmp_name'], 'r');
// OTHER CURL CONFIGURATION
curl_setopt($ch, CURLOPT_INFILE, $file);
curl_exec($ch);
答案 1 :(得分:1)
首先,您的脚本可以通过$ _FILES数组访问上传的文件。
来自http://www.tizag.com/phpT/fileupload.php
$ _FILES数组是PHP存储的地方 有关文件的所有信息。那里 我们是这个数组的两个元素 需要了解这一点 示例
- uploadedfile - uploadedfile是我们在HTML中分配的引用 形成。我们需要这个来告诉你 $ _FILES数组我们想要的文件 玩弄。
- $ _ FILES ['uploadedfile'] ['name'] - name包含用户上传文件的原始路径。
- $ _ FILES ['uploadedfile'] ['tmp_name'] - tmp_name包含的路径 临时文件驻留在 服务器。该文件应存在于 服务器在一个临时目录中 临时名称。
要在使用libcurl发送的POST中包含此文件,请使用字段数组而不是字符串。将文件包含在以下字段之一:
$post_fields = array (
$key => $value,
...
$file_key => "@" . $filename,
);
如果您使用“@”符号,libcurl将读取该文件并将其包含在POST中。
然后使用
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);