PHPについて質問です。


現在写真データをアップロードするスクリプトを作成しようと考えております。

以下が現在作成途中段階のサイトです。

サイト:http://oskuni7.sakura.ne.jp/upload.php

このサイトに下記の機能を付け加えたいと考えております。

●アップロードするファイル名をPHPの中で変えてアップロードする。

●画像をPHPの中で指定したサイズに変更してアップロードする。

上記機能を追加するにはどのようなコードを付け加えればよろしいでしょうか?

お手数をおかけしますが、知っている方おりましたらよろしくお願いいたします。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/05/05 09:45:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taichino0730 No.2

回答回数2ベストアンサー獲得回数1

ポイント35pt

画像のリサイズ等の処理はImageMagickを使うと簡単かつ色々出来ます。

http://mechanics.civil.tohoku.ac.jp/soft/node43.html


またImageMagickはphp用にimagickというインターフェースが存在しています。

少しインストールが手間ですが、ソースコードは綺麗になりますので、

こちらを使った方が望ましいです。

http://php.benscom.com/manual/ja/book.imagick.php


サンプルを書いてみました。環境が解らないのでimagickは使用していません。

<?php
/**
 * 画像ファイルのアップロードテスト
 * 
 *   サーバに画像をアップロードして、サムネイルの作成を同時に行います。
 *   このスクリプトの置かれているパスにimg, thumbnailの両ディレクトリが
 *   書き込み権限がある状態で存在している事を想定しています。
 */
# var_dump($_FILES);

isset($_FILES['upfile']) or die("no uploaded file \n"); 

$filename     = $_FILES['upfile']['name'];     # アップロードされたファイルの元々の名前
$tmpFilename  = $_FILES['upfile']['tmp_name']; # アップロード一時ファイル
$imgDir       = 'img';                         # 画像保存ディレクトリ
$thumbnailDir = 'thumbnail';                   # 画像のサムネイル保存ディレクトリ

# まずファイルを移動
$destFilename = $imgDir . "/" . getFileId($filename);
move_uploaded_file($tmpFilename, $destFilename) or die("Failed to upload $filename");

# 次にファイルをリサイズしてサムネイル用のディレクトリに保存する
$thumbnailFilename = $thumbnailDir . "/" . getThumbnailFileId($filename);
$width  = 50;
$height = 50;
exec("convert -resize {$width}x{$height}! $destFilename $thumbnailFilename", $result, $status);
($status == 0) or die "Failed to create thumbnail image \n";

#
# 保存するファイル名をココで変更する
#
function getFileId($name) {
  return $name;
}
#
# 保存するサムネイルファイル名をココで変更する
#
function getThumbnailFileId($name) {
  return $name;
}
?>

<html>
<head><title>画像アップロードテスト</title></head>
<body>
  元画像<img src="<?php echo $destFilename ?>" />
  サムネイル<img src="<?php echo $thumbnailFilename ?>" />
</body>
</html>
id:aiomock

ご回答ありがとうございます。

2009/05/01 16:05:33

その他の回答1件)

id:nink No.1

回答回数16ベストアンサー獲得回数1

ポイント35pt

フローとしては

1.オリジナルイメージとしてデータを受け取る

 (例:「ほげほげ.jpg」という1024*768サイズのJPG画像)

2.指定された画像サイズに変換する

 (例:240*320として保存したいので、サイズを変更する(拡大縮小・トリミングなど))

3.サーバ上に保存する際に、名前を変えて保存する

 (例:「ほげほげ.jpg」を「hoge01.jpg」という名前で保存する)

って形で実現できると思います。

if(isset($_POST["test"]))

{

$updir = "./pic/";

// これはUPされたファイルのオリジナルのファイル名

//$filename = $_FILES['upfile']['name'];

// ↑これを利用しないで好きな名前に書き換えればOKです

$filename = "hoge.jpg";

// 保存先

move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) ;


echo "データのアップロードが完了しました。";

}


サイズ変更は「imagecopyresampled」を調べてみてください。

http://www.phppro.jp/phpmanual/php/function.imagecopyresampled.h...

参考ソースとして以下の通り。


// 保存先

$path = "tmp/"; // 元の保存先

$img_name = "ほげほげ.jpg"; // 元のファイル名

$save_path = "tmp2/"; // 保存先

$save_name = "hoge01.jpg"; // 保存名

$change_size = 240; // 保存したい画像の横幅

// サイズ変更

$normal = getimagesize($path.$img_name);

$ratio = $change_size / $normal[0];

$small[0] = floor( $normal[0] * $ratio );

$small[1] = floor ( $normal[1] * $ratio );

// JPG読込

$img_src = imagecreatefromjpeg($path.$img_name);

// 空の画像作成

$new_src=imagecreatetruecolor($small[0],$small[1]);

// 画像の保存

imagecopyresampled($new_src,$img_src,0,0,0,0,

$small[0],$small[1],

$normal[0],$normal[1]);

// JPG保存

imagejpeg($new_src,$save_path.$save_name);

id:aiomock

ご回答ありがとうございます。

2009/04/29 22:18:09
id:taichino0730 No.2

回答回数2ベストアンサー獲得回数1ここでベストアンサー

ポイント35pt

画像のリサイズ等の処理はImageMagickを使うと簡単かつ色々出来ます。

http://mechanics.civil.tohoku.ac.jp/soft/node43.html


またImageMagickはphp用にimagickというインターフェースが存在しています。

少しインストールが手間ですが、ソースコードは綺麗になりますので、

こちらを使った方が望ましいです。

http://php.benscom.com/manual/ja/book.imagick.php


サンプルを書いてみました。環境が解らないのでimagickは使用していません。

<?php
/**
 * 画像ファイルのアップロードテスト
 * 
 *   サーバに画像をアップロードして、サムネイルの作成を同時に行います。
 *   このスクリプトの置かれているパスにimg, thumbnailの両ディレクトリが
 *   書き込み権限がある状態で存在している事を想定しています。
 */
# var_dump($_FILES);

isset($_FILES['upfile']) or die("no uploaded file \n"); 

$filename     = $_FILES['upfile']['name'];     # アップロードされたファイルの元々の名前
$tmpFilename  = $_FILES['upfile']['tmp_name']; # アップロード一時ファイル
$imgDir       = 'img';                         # 画像保存ディレクトリ
$thumbnailDir = 'thumbnail';                   # 画像のサムネイル保存ディレクトリ

# まずファイルを移動
$destFilename = $imgDir . "/" . getFileId($filename);
move_uploaded_file($tmpFilename, $destFilename) or die("Failed to upload $filename");

# 次にファイルをリサイズしてサムネイル用のディレクトリに保存する
$thumbnailFilename = $thumbnailDir . "/" . getThumbnailFileId($filename);
$width  = 50;
$height = 50;
exec("convert -resize {$width}x{$height}! $destFilename $thumbnailFilename", $result, $status);
($status == 0) or die "Failed to create thumbnail image \n";

#
# 保存するファイル名をココで変更する
#
function getFileId($name) {
  return $name;
}
#
# 保存するサムネイルファイル名をココで変更する
#
function getThumbnailFileId($name) {
  return $name;
}
?>

<html>
<head><title>画像アップロードテスト</title></head>
<body>
  元画像<img src="<?php echo $destFilename ?>" />
  サムネイル<img src="<?php echo $thumbnailFilename ?>" />
</body>
</html>
id:aiomock

ご回答ありがとうございます。

2009/05/01 16:05:33
  • id:aiomock
    現在のコードは以下のようになっております。

    <?

    if(isset($_POST["test"]))
    {
    $updir = "./pic/";
    $filename = $_FILES['upfile']['name'];
    move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) ;
    echo "データのアップロードが完了しました。";
    }

    ?>
    <html>
    <body>
    <FORM method="POST" action="<?php echo $_SERVER['PHP_SELF'];?>" enctype="multipart/form-data">
    ★画像のアップロード★<br><br>
    写真1:<input type="file" name="upfile" size="50"> 
    <input type="submit" name="test" value=" データの登録 ">
    </form>
    </body>
    </html>
  • id:kn1967
    (1)名前の変更
    名前は
    $filename = $_FILES['upfile']['name'];
    で決めているので $filename にお望みの名前を入れれば良いのですが
    名前を変えるに際して、どのような命名ルールをお考えなのかが判らないと
    誰も答えられないでしょう。

    (2)画像の編集
    sakuraでは GDライブラリ が使えるらしいのですが未検証。

    sakuraのどの契約コースか調べようと思ったのですが
    質問回数が多いため、探せませんでした。
    サーバの契約コースによって対応方法が異なる場合も考えられますので
    ご面倒でも毎回書いておかれることを勧めます。

    以上、回答というほどでもないのでコメント欄で・・・。
  • id:aiomock
    kn1967 さん

    ご回答ありがとうございます。

    (1)の名前ですが、 数字.jpg で保存をできるようにしたいと考えております。

    数字はデータベースのデータ数をカウントした値を$filenameに入れたいと考えております。

    数字.jpgの形式で保存をする場合が少しわからないのですが、こちらはどのように対処すればよろしいでしょうか。

    (2)さくらのコースはスタンダードコースになります。契約コースの提示がなくて申しわけありません。問い合わせをしたところスタンダードコース以上であればGDライブラリが使用できるとのことでした。ライブラリを使用したことがないので、少し調べてみたいと思います。
  • id:kn1967
    >数字はデータベースのデータ数をカウントした値を$filenameに入れたいと考えております。

    $filename に値を入れれば良いだけですけど? それが何か? と問いたくなりますが、
    どこから、どこまでが判らないのでしょうか?

    データベースのデータ数をカウントする方法が判らないというのでしょうか?
    だとすれば、データベースをカウントする際のルール決めが必要となります。
    (MySQLをお使いなのは過去の質問から簡単に判りますので結構です)

    ルール決めすらも決まっていないのだとすれば・・・。

    まったくの余談ですが
    プログラミングとは、コンピュータに動作を指示するための文書作成のようなものです。
    これは実は「人に質問する場合や指示を出す場合の文書作成」と通じるところがあります。
    5W1H いつ、どこで、だれが、なにを、どのように、どうしたいか
    5W2H いつ、どこで、だれが、なにを、どのように、どうしたいか、予算はいくらで
    ということをいつも意識しながら質問文に抜けが無いかを確認するようにしましょう。
    質問がうまくなれば的確な回答を得られやすくなるだけでなく
    人に聞かなくてもプログラミングできるようになってきます。
    以上、まったくの余談で、余計なお世話ですが・・・。
  • id:aiomock
    kn1967さん

    ご回答ありがとうございます。そしていつもご指摘ありがとうございます。

    とても勉強になりました。

    今回ですが質問がうまく伝わらず、説明不足でした。

    自分の中で一度まとめて質問をさせていただきます。

    以後5W1Hにも気を使い質問をさせていただければと思います。

    いつもご回答本当にありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません