2017-05-06 230 views
0

我正在查看下载文件,稍后再次将其上传到API以检查文件是否是恶意文件。从文件名中获取文件名和扩展名没有文件名

起初很容易,如果文件名+扩展名在URL中,但看到情况并非总是如此,我不知道提供给我的确切文件名和扩展名,所以当试图保存它时到一个临时文件,我将无法为其分配文件扩展名。

是否有可能以某种方式获取该文件名?或者至少是扩展名,所以我可以将其添加到我的临时文件再上传之前..

这是我目前有(我知道,我目前只是使用tmpfilename,但这将改变一次我知道如何检查的文件扩展名):

public function download($url, $tmpfilename, $method) 
    { 
     $client = new Client([ 
      // Base URI is used with relative requests 
      'base_uri' => $url, 
      'sink' => $tmpfilename, 
     ]); 
     try { 
      $response = $client->request($method); 
      if (is_bool($response)) { 
       return $response; 
      } else { 
       return $response->getBody()->getContents(); 
      } 
     } catch (\GuzzleHttp\Exception\ClientException $e) { 
      return false; 
     } catch (\GuzzleHttp\Exception\RequestException $e) { 
      return false; 
     } 
    } 
+0

文件扩展名可以很容易地改变,并且没有对文件内容进行匹配。 – Reeno

+0

没问题,这个问题实际上与此无关。我只是想知道如何从一个不包含文件名的URL中访问正在下载的文件和文件名。 – Marius

回答

1

你可以猜到使用Content-Type响应头的文件扩展名。

例如,ralouphie/mimey做转换:

$extension = $mimes->getExtension($response->getHeaderLine('Content-Type')); 
+0

如果我使用上面的代码,你会如何在运行请求之前添加扩展?因为它会返回'$ response-> getBody() - > getContents()'。我试图让它下载一个txt文件,所以$ file = guzzlerequestabove,然后是'mime_content_type($ file)',但只返回'application/octet-stream'。 – Marius

+0

您需要原创的回复,因为只有它包含原始的“Content-Type”。 –

+0

顺便说一句,如果你使用'sink',你可能不需要'$ response-> getBody() - > getContents()',因为内容已经写入文件。 –

相关问题