0

我正在为我的团队创建一个内部工具,允许受信任的团队成员通过 php 和 curl 将远程文件保存到我们的服务器。我的打开、写入和关闭工作完美,但我想在创建和写入本地文件之前添加一个检查以确保文件是某种 mime 类型。

基于一组 mime 类型,我怎么能做到这一点?

$ch = curl_init();
$fp = fopen($local_file, 'w+');
$ch = curl_init($remote_file);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_exec($ch);
curl_close($ch);
fclose($fp);
4

3 回答 3

1

我通过在文件传输后通过 fileinfo 检查 mime 解决了这个问题。如果它不是有效的 mime 类型,那么我将其删除。

$ch = curl_init();
$fp = fopen($local_file, 'w+');
$ch = curl_init($remote_file);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_exec($ch);
curl_close($ch);
fclose($fp);

$finfo = new finfo(FILEINFO_MIME);
$mime_type = $finfo->file($local_file);

if (strpos($mime_type, 'application/xml') === false) {
    unlink($local_file);
}
于 2013-03-19T13:56:27.037 回答
0

例如:

$ch = curl_init('http://static.php.net/www.php.net/images/php.gif');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);

$mime = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

in$mime具有 mime 类型的文件。

于 2013-03-18T20:07:39.153 回答
0

棘手!您可以先下载整个文件(到内存或临时文件夹中。)如果您想流式传输它,您可能必须:

  1. 设置 CURLOPT_HEADER 以在您返回的数据中包含 HTTP 响应标头

  2. 设置 CURLOPT_WRITEFUNCTION 而不是 CURLOPT_FILE,读取并解析 http 标头以查看 mime 类型,然后决定是否要创建/写入文件。

显然,这是一项相当多的工作,因为您必须对 HTTP 标头进行一些基本解析,并且可能需要缓冲以一次获取整个 HTTP 标头。

希望有人会发布一个更简单的解决方案。

伪代码:

state = headers
buf = ''
fd = null
func writefunc(ch, data)
   if state is headers
      buf .= data
      div = buf.strpos "\r\n\r\n"
      if div !== false
         mime = get_mime buf, div
         if mime_ok mime
            fd = fopen ...
            fd.write buf.substr div+4
            state = saving
         else
            # returns other than data.length() abort connection
            return 0
  else
     fd.write data
  return data.length()
于 2013-03-18T20:14:41.517 回答