1

私は自分のウェブサイトの添付システムを作成しています。フォームベースのアップロード方法では、次を使用して画像サイズを取得できます。

$SizeResult = getimagesize($_FILES['file']['tmp_name']);

しかし、HTML5 のファイル API を介したドラッグ アンド ドロップ アップロード システムを使用すると、ファイルはフォーム ポストではなく黒魔術と魔術によってアップロードされます。

$File = file_get_contents('php://input');

この場合、 $File はnameではなく、ファイルの実際のバイナリ コンテンツです。

getimagesize()がファイルのみを受け入れるように見える場合、どのように $File のサイズを取得できますか? 内部的には、getimagesizeはディスク自体からファイルを開きたいと考えています。$File を受け入れたくありません。

この問題を回避する方法を知っている人はいますか? ファイルをディスクに保存しないようにしたいと思っています。

4

3 に答える 3

4

これは私が意味したことです、試してみてください:

$File = file_get_contents('php://input');
$image = ImageCreateFromString($File);
echo ImageSX($image); // width
echo ImageSY($image); // height
于 2012-03-02T03:38:08.657 に答える
2

私は最善だと思う解決策を作りました。正直に言うと、 getimagesize()関数を使用する主な理由は、ファイルの MIME タイプを取得することでした (ファイルが画像であることを確認するため)。サイズを取得することは追加のボーナスですが、exif_imagetype()関数の周りの質問を簡単に組み立てることができました。どちらの関数もファイル名のみを受け入れるため、問題は同じです。ファイルの内容ではありません。

だから私がしたことは、基本的にPHPソースコードを調べて、 exif_imagetype()がMIME情報をどのように読み取るかを確認することでした。ファイルの最初の 12 バイトしか読み取らないことがわかります。その機能を次のように複製しました。

function GetConstMimeArray()
{
    // MIME type markers (taken from PHP sourcecode consts in \ext\standard\image.c starting at line 39).
    return array
    (
        'gif' => array(ord('G'), ord('I'), ord('F')),
        'psd' => array(ord('8'), ord('B'), ord('P'), ord('S')),
        'bmp' => array(ord('B'), ord('M')),
        'swf' => array(ord('F'), ord('W'), ord('S')),
        'swc' => array(ord('C'), ord('W'), ord('S')),
        'jpg' => array(0xff, 0xd8, 0xff),
        'png' => array(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a),
        'tif_ii' => array(ord('I'), ord('I'), 0x2a, 0x00),
        'tif_mm' => array(ord('M'), ord('M'), 0x00, 0x2a),
        'jpc' => array(0xff, 0x4f, 0xff),
        'jp2' => array(0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a),
        'iff' => array(ord('F'), ord('O'), ord('R'), ord('M')),
        'ico' => array(0x00, 0x00, 0x01, 0x00)
    );
}

// Get an array of known MIME headers.
$MimeTypeConsts = GetConstMimeArray();

// Get first 12 bytes of file from stream to do a MIME check.
$File = file_get_contents('php://input', null, null, 0, 12);
if(strlen($File) < 12)
    return;

// Scan first 12 bytes of file for known MIME headers.
$MatchedMime = '';
foreach($MimeTypeConsts as $Type => $Bytes)
{
    $NumMatching = 0;
    $NumBytes = count($Bytes);
    for($i = 0; $i < $NumBytes; $i++)
    {
        if(ord($File[$i]) == $Bytes[$i])
            $NumMatching++;
        else
            break;
    }
    if($NumMatching == $NumBytes)
    {
        $MatchedMime = $Type;
        break;
    }
}

// Check if the file does NOT have one of the known MIME types.
if(strlen($MatchedMime) <= 0)
    return;

// If we fix up TIF_TT and TIF_MM, you can use $MatchedMime in lieu
// of the extension on the file name.
if($MatchedMime == 'tif_ii' || $MatchedMime == 'tif_mm')
    $MatchedMime = 'tif';

// What's the max size allowed to upload?
$MaxSize = min(ReturnBytes(ini_get('post_max_size')), MAX_UPLOAD_SIZE);

// Get full file.
$File = file_get_contents('php://input', null, null, 0, $MaxSize + 8);

// Get file size.
$Size = strlen($File);
if($Size > $MaxSize)
    return;

// Get hash of the file contents.
$Hash = hash('SHA1', $File, true);

file_put_contents(UPLOADS_DIR.'/'.bin2hex($Hash).'.'.$MatchedMime, $File);

ファイルは、ハッシュを名前として使用し、MIME タイプを拡張子として使用して、UPLOADS_DIR に保存されます。(ファイル名に元々付いていた拡張子は無視され、使用されません。)

于 2012-03-03T22:27:59.580 に答える
0

お役に立てれば

<?php
list($width, $height, $type, $attr) = getimagesize("img/flag.jpg");
echo "<img src=\"img/flag.jpg\" $attr alt=\"getimagesize() example\" />";
?>
于 2012-03-02T04:55:06.607 に答える