【问题标题】:Error in uploading file using PHP使用 PHP 上传文件时出错
【发布时间】:2012-02-17 14:49:42
【问题描述】:

我要求用户上传文件,通过以下表单向另一个页面 Upload.php 发出 POST 请求

<form name="input" action="upload.php" method="post" enctype="multipart/form-data">
    Username: <input type="text" name="username" /><br/>
    <input type="file" name="file" /> <br/>
    <input type="submit" value="Submit" />
</form>

在 Upload.php 中,我使用之前表格中填写的数据使用 Curl 函数发出 POST 请求,为此我编写了以下代码:

$data = array(
        "username" => $username,
        "password" => $password,
        "title" => $title,
        "srcfile" => "@".$_FILES['file']['tmp_name']);

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_URL, $api);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response=curl_exec($ch);

echo $response;

这样我可以成功上传文件,但是上传的文件的名称没有由此设置的任何扩展名

$_FILES['file']['tmp_name']

因此我无法使用服务器上的文件。

我应该如何使用从 POST 请求中获得的文件来发出另一个 POST 请求?

提前致谢。

【问题讨论】:

  • 嗨,欢迎来到 StackOverflow!查看您的代码,您似乎对 PHP 中文件上传的工作方式缺乏了解。查看手册,如果您仍然难以实现您的目标,请再试一次并更新您的问题:php.net/manual/en/features.file-upload.post-method.php
  • 也尝试过使用 "srcfile" => "@".$_FILES['srcfile']['tmp_name'].";type=".$_FILES['srcfile']['type '] 但仍然无法正常工作
  • 虽然我使用的是 PHP 5.3.1 bugs.php.net/bug.php?id=48962,但我遇到了这个 PHP 错误

标签: php post file-upload


【解决方案1】:

上述情况的问题是,虽然我们可以使用 $_FILES['file']['tmp_name'] 来获取文件,但是文件扩展名与原始文件的扩展名不同,甚至如下代码不起作用,应该按照这个 bug https://bugs.php.net/bug.php?id=48962 in PHP 5.0 中的文件运行

"srcfile" => "@".$_FILES['file']['tmp_name'].";filename=".$_FILES['file']['name'].";type=".$_FILES['file']['type']

我终于用下面的办法解决了上面的问题:

第 1 步:将通过表单的 POST 请求发送的文件临时保存在服务器或您的计算机上的文件夹中。

第 2 步:现在使用临时保存文件的路径使用 CURL 发出 POST 请求,其代码与上述相同,但文件位置发生了变化。

"srcfile" => "@".temp_file_path

【讨论】:

    【解决方案2】:

    $_FILE['file'] 是一个数组,表示complex types 代表SimpleXMLElement 的属性。

    【讨论】:

      【解决方案3】:

      您应该读取文件,对其进行编码并将编码值分配给 XML 元素。例如,您可以使用以下内容:

      $xml->file = base64_encode( file_get_contents( $_FILE['file'][ 'tmp_name' ] ) );
      

      当然在真实的代码中你应该添加错误检查等。

      【讨论】:

      • 这个答案在我的情况下不起作用,因为我还必须在带有文件名的 POST 请求中将上传到服务器上的文件指定为“srcfile”参数。
      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2012-02-04
      • 2012-01-05
      • 1970-01-01
      相关资源
      最近更新 更多