将上传的文件发布到另一个PHP页面?

时间:2009-12-16 19:59:13

标签: php http file-upload curl https

这是我的问题。我有一个不太“用户友好”的票务跟踪系统,但我希望我的用户能够在不让他们看到它的情况下向系统提交“门票”。

我只使用自定义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'?

- 以色列

2 个答案:

答案 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);