2017-05-06 203 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()',因爲內容已經寫入文件。 –

相關問題