1

私はphpを使用するのが初めてで、ここ数日間完全に困惑しています。$_FILES の複数の配列から抽出されたキーと値のペアを抽出して使用しようとしています。これはばかげてばかげた質問だと確信していますが、私は困惑しています。次のコードを実行すると、次の結果が得られます。

$exif = exif_read_data('/uploads/'.$file['name'],  0, true);

  foreach($_FILES as $file){
  echo $file['name']  .  " :<br />\n";
  foreach ($exif as $key => $section) {
      foreach ($section as $name => $val) {

          echo "<pre>This is \$name" . $name ."<br>";
          echo "<pre>This is \$val" . $val ."<br>";
          }
        }
     } 

出力は次のとおりです。

アップロードされた画像

Image contains headers  
Across the Field - LK.jpg :
FILE.FileName: Across the Field - LK.jpg
FILE.FileDateTime: 1361055472  
FILE.FileSize: 294785  
FILE.FileType: 2  
FILE.MimeType: image/jpeg  
FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, EXIF  
COMPUTED.html: width="700" height="525"  
COMPUTED.Height: 525  
COMPUTED.Width: 700  
COMPUTED.IsColor: 1  
COMPUTED.ByteOrderMotorola: 0  
COMPUTED.ApertureFNumber: f/9.0  
COMPUTED.Copyright: Copyright 2010   
IFD0.ImageWidth: 1024  
IFD0.ImageLength: 768  
IFD0.BitsPerSample: Array  
IFD0.PhotometricInterpretation: 2  
IFD0.Model: NIKON D300  
IFD0.Orientation: 1  
IFD0.SamplesPerPixel: 3  
IFD0.XResolution: 720000/10000 
IFD0.YResolution: 720000/10000    
IFD0.ResolutionUnit: 2  
IFD0.Software: Adobe Photoshop CS5 Windows  
IFD0.DateTime: 2013:01:24 16:33:16  
IFD0.Artist: lken  
IFD0.Copyright: Copyright 2010   
IFD0.Exif_IFD_Pointer: 316  
THUMBNAIL.Compression: 6
THUMBNAIL.XResolution: 72/1  
THUMBNAIL.YResolution: 72/1 
THUMBNAIL.ResolutionUnit: 2  
THUMBNAIL.JPEGInterchangeFormat: 642  
THUMBNAIL.JPEGInterchangeFormatLength: 0  
EXIF.ExposureTime: 1/100  
EXIF.FNumber: 9/1  
EXIF.ISOSpeedRatings: 400  
EXIF.ExifVersion: 0221  
EXIF.DateTimeOriginal: 2010:08:15 05:57:17  
EXIF.DateTimeDigitized: 2010:08:15 05:57:17 
EXIF.ShutterSpeedValue: 6643856/1000000   
EXIF.ApertureValue: 633985/100000  
EXIF.FocalLength: 1700/100  
EXIF.ColorSpace: 65535  
EXIF.ExifImageWidth: 700   
EXIF.ExifImageLength: 525  

簡潔にするために、2 番目の写真のデータは省略しました。

$_FILES の出力は次のとおりです。

Array
(
    [userfile] => Array
        (
            [name] => Across the Field - LK.jpg
            [type] => image/jpeg
            [tmp_name] => C:\wamp\tmp\php223.tmp
            [error] => 0
            [size] => 294785
        )

    [userfile1] => Array
        (
            [name] => autumn-panorama - lk.jpg
            [type] => image/jpeg
            [tmp_name] => C:\wamp\tmp\php224.tmp
            [error] => 0
            [size] => 106349
        )
)

私はすべてのサイトとすべての本を調べて、名前と値のペア ( IFD0.ImageWidth: 1024 や IFD0.ImageLength: 768 など) にアクセスする方法を見つけたので、アップロード サイズなどに制限を設定できます。

私は今非常に混乱しており、助けや指示をいただければ幸いです。リソースは特に高く評価されています。ありがとうございました。

4

1 に答える 1

1

さて、そのコード スニペットは既に仕事をしているので、最初のファイルでは、以下を実行できるはずです。

$exif = exif_read_data($_FILES['userfile']['tmp_name'],  0, true);

if (isset($exif['IFD0']['ImageWidth']) && isset($exif['IFD0']['ImageLength']))
{
    // good to go!
    $width = $exif['IFD0']['ImageWidth'];
    $height = $exif['IFD0']['ImageLength'];
}
else
{
    // size data not present, fallback onto something else
    return;
}

そうは言っても、exif データを信頼して制約の検証を行うべきではありません。Exif データはメタデータです。それらは簡単になりすまし/注入されるか、まったく存在しない可能性があります。代わりに、まずファイル サイズ自体を確認し、次に getimagesize() などを使用して、実際の画像データの分析を行います。http://www.php.net/manual/en/function.getimagesize.phpを参照してください。

于 2013-02-17T01:23:25.900 に答える