2017-05-06 35 views
0

ファイルをダウンロードする際に、ファイルを悪意のあるかどうかを確認するためにAPIに再度アップロードすることを検討しています。ファイル名なしのURLからファイル名と拡張子を取得する

最初は簡単でしたが、ファイル名+拡張子が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() 'は必要ありません。 –

関連する問題