Home > PHP

PHP Archive

【PHP】’ImagickException’ with message ‘No IDATs written into file

今まで見たこと無いエラーが出てきたので。

うーうーうなってたらげこさんが調べてくれました。

http://rubyforge.org/forum/forum.php?max_rows=100&style=nested&offset=2021&forum_id=33

By: Tim Hunter RE: Writing an image to STDOUT [ 返信 ] 2005-11-18 13:18 A follow-up: I checked this out last night. It turns out that to_blob works with 0×0 GIF and MIFF images, and raises a MagickException for a 0×0 PNG image. However, if you call to_blob with a 0×0 JPEG image then libjpeg will exit. I’ve added a check to to_blob for this case. With the test, if you call to_blob for a 0×0 JPEG image to_blob will raise a RunTimeError exception.

「0×0の画像を writtenImage() しようとするとエラーが出るよ!」 ってことらしいです。

実際のコードを見てみたら、 グローバルで定義した変数を、関数の中で使うときに、 global hoge; ってやってなかったので、値が全部 NULL になったのが原因のようでした。

エラーメッセージでググっても答えが見つからなかったのでタイトルにしてしまうのです。

【JS】iOS4.1以下で、audioを制御できない【とみせかけて犯人はPHP】

■追記 2011/6/8 19:06 —————————————————————————- 解決しました。

実際の環境では、PHPでドキュメントルートの外からmp3のデータを引っ張ってきていたのですが、 そのコード上で、

header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
と、Content-Type を複数指定していました。 ここを、 “audio/mpeg” のみに(こっそり)直したところ、無事iOS4.0の端末でも再生されるようになりました。 まさかPHPの方が原因だったとは・・・。

結論

iOS4.0(恐らくiOS4.1以下)では、複数の Content-Type には非対応、iOS4.2から(何故か)対応するようになった。

おまけ

ちなみに、 複数指定されていた Content-Type を、それぞれ一つずつ選んで渡してみたところ、次のような結果に。

iOS4.2 iOS4.0
audio/mpeg
audio/x-mpeg
audio/x-mpeg-3 ×
audio/mpeg3

とはいっても、例えば、 “audio/mpeg, audio/mpeg3″ のように指定しても、やっぱり鳴らなかったので、

複数指定はやっぱりダメなようです。

まだ検証中。 とりあえず検証してる内容をメモ。

何が起こったか

iOS4.1以下の端末(iPhone 3GS,iPhone4問わず)で、以下のスクリプトで音声再生ができない。 (実際に検証したのはiOS4.0の端末と、iOS4.2の端末)

var audio = new Audio('hoge.mp3');
$('#play').bind('touchend', function(){
    audio.play();
});

じゃぁなんでiOS4.1以下なの

Safari – Wikipedia iOS4.2 から Safari5 が搭載されるようになってる。怪しい。

HTMLMediaElement Class Reference | Safari Developer Library iOS4.1 まで使われていた autobuffer が廃止され、iOS4.2 からは preload というプロパティに変わっている。

この辺に原因があるのではと思い、この現象はiOS4.1以下で起こるものと推測する。

Continue reading

【PHP】ディレクトリを削除しようとしたらはまった

ファイルを書き出すスクリプトを作ってる際、 既に書き出し用のフォルダが存在していたらそのディレクトリを削除する っていう関数を作ろうと思ったらまんまとはまったのでメモ。

まずはここを参考にディレクトリ削除の関数を作ってみる。

PHP:ディレクトリを削除する|STUDIO WING .lib

  function delDir($path){
    if($handle = opendir($path)){
      while($item = readdir($handle)){
        if($item != '.' && $item != '..'){
          if(is_dir("$path/$item")){
            delDir("$path/$item"); //再帰
          }else{
            unlink("$path/$item");
            echo "...";
          }
        }
      }
      echo "<br/>";
    }
    closedir($handle);
    rmdir($path);
  }

とりあえずこれで特に問題なく動くかと思われたものの、 数字のみ(0~の連番)のディレクトリだけ何故か削除されない模様。 色々調べてるうちに下記のエントリに行き着いた。

ディレクトリ内のファイル一覧を取得する|Affirmative Way

正しくは以下のように取得してやる PHP: readdir – Manualより引用 警告 この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される 0 や “” といった値を返す可能性もあります。詳細については 論理値のセクションを参照してください。この関数の返り値を調べるには ===演算子 を使用してください。

ということなので下記のように書き換え。

  function delDir($path){
    if($handle = opendir($path)){
      while(false !== ($item = readdir($handle))){ //!== ってしないとディレクトリ名が"false"になることもある
        if($item != '.' && $item != '..'){
          if(is_dir("$path/$item")){
            delDir("$path/$item"); //再帰
          }else{
            unlink("$path/$item");
            echo "...";
          }
        }
      }
      echo "<br/>";
    }
    closedir($handle);
    rmdir($path);
  }

これで無事削除完了。 文字列 ”0” も “==” だと false なのよね。。

というわけで2011年初エントリ。

【PHP】ファイルをダウンロードするときに確認ダイアログを表示する

JPEGとかPNGとかの画像をダウンロードさせるページを作っていたのですが、 aタグのhrefに画像のパスを書いても、対象の画像に遷移して困ってしまいました。 ZIP等をダウンロードするときみたいに確認ダイアログを出したかったので、 色々調べてみました。

perlやPHPでファイルのダウンロード確認ダイアログを表示させる方法 | perl/CGI | 阿部辰也のブログ――人生はひまつぶし。

ここのPHPのソースを一部改変してJSからドーンします。

&lt;?
$files = $_GET;
$src = &quot;./hoge/{$files['filename']}&quot;;</p>

<h1>HTTPヘッダを送信</h1>

<p>if(file_exists($src)){
header(&quot;Content-type: application/octet-stream&quot;);
header(&quot;Content-Disposition: attachment; filename=\&quot;{$files['filename']}\&quot;&quot;);</p>

<h1>出力</h1>

<p>readfile($src);
}else{
  header(&quot;Location: ./fuga.html&quot;);
}
?&gt;

header(“Content-Disposition: attachment; filename=\”{$files['filename']}\”"); ここの記述でダイアログを表示させる(ついでにファイル名を決めることができる)ようですが、 セキュリティ的に問題もある模様。 [Studying HTTP] HTTP Header Fields

あと、ファイルによってMIMEタイプ(Content-Type)が異なるので、それもなんとかしなければならず。 PHP の mime_content_type() を使おうとするも非推奨とのことで断念。 とりあえず application/octet-stream とすることで回避(と言えるのかわかりませんが)しました。

で、このPHPをJSから叩く

    $('a.download').click(function(e){
      e.preventDefault();
      var filename = ($(this).attr('href')).split('/');
      filename = filename[filename.length-1];
      location.href = './fuga.php?filename='+filename;
    });
firebug とかで href 書き換えられて押されたりすると怖いので、 ファイル名の部分だけを切り取って送るようにしました。

ここまでできたので、今度は欲しい画像を選んでZIPに圧縮してダウンロード、とか作りたいのですが。 さぁ、時間が無い。

■おまけ application/octet-stream とはなんぞ web用語辞典 – application/octet-stream

なんだかわからないけど何かのファイル っていう意味っぽいです。

【PHP】Imagick を使ったら Apache ごと落ちたので色々がんばってみた

  • 2010-04-21 (水)
  • PHP

自分用メモ

XAMPPでPHPが入るけど自分で入れなおしたほうがいいよ! インストーラーじゃなくてZIPから!

$file_name =’a.jpg’; $ext = “jpg”; $image = new Imagick($file_name); header(‘Content-type: image/’.$ext); echo $image; 矩形を描画したりとかは出来たけどファイルを読みこんでどうこうができない。 なのでさらに調べることに。 (もともとMikko’s blogはVC6じゃなくてVC9にしろよってかいてあったきがする。) ちなみに動かなかったときのphpinfoは Compiler MSVC9 (Visual C++ 2008) って書いてあった。 結果的には XAMPPのバージョンによってはphpinfoで見たときにCompilerの項目がMSVC6になっているのでMSVC9にすることが必要。 * 1.PHPを入れなおす(スレッドセーフ版) * 2.ImageMagickのバージョンは最新に。 * 3.php_imagick_ts.dll(スレッドセーフ版)を入れる * 4.php.iniからエラーが出る項目をコメントアウトする という流れになると思います。

【PHP】Imagemagicをインストールしたけどエラー|</gecko>:げことじ。2010-04-21 (水) 14:16

転載乙!

起こったこと。 ・PHPでImagickが使えない → php_imagick.dll の最新版を持ってくる(TS/NoTS、VC6/VC9に注意。phpinfo()で確認) ・Imagickを使うとApacheごと落ちる → VC6だったから。VC9じゃないとだめ。 ・Imagickがphpinfo()に表示されない → htdocsのphp.iniのパスとか、php.iniでextension=php_imagick.dllやってるか確認 ・それでもやっぱり表示されない → DLLファイルを書き換えるの忘れてた。TS/VC6をTS/VC9に変更。自分の環境次第。

OAuth の API の URL

—————-【追記(2010/1/28 20:28)】—————-

THE☆勘違いでした。 下記の件とOAuthの認証が上手くいかない件とは全く関係なさそうです。 ですが、依然としてなにゆえこのような書き方なのかは謎なままなので、 エントリー自体はそのまま残しておきます。

———————-追記ここまで———————-

Twitter API の OAuth の URL って変わったのかな…。 今開発中の OAuth で認証させるサービスが少し前から認証できなくなってて、 なんでだろーなんでだろー思ってたんですけど。 今日改めて API のURLの部分見てみたら何かおかしい。

twitteroauth.php

  function accessTokenURL()  { return 'https://twitter.com/oauth/access_token'; }
  function authenticateURL() { return 'https://twitter.com/oauth/authenticate'; }
  function authorizeURL()    { return 'https://twitter.com/oauth/authorize'; }
  function requestTokenURL() { return 'https://twitter.com/oauth/request_token'; }

って書いてあったんだけど。 実際のスキームは https:// ではなく http:// でした。 /oauth_clients にもそう書いてあるし、仕様書見てもそうなってるし。 2週間ぐらい前までは普通に通ってたので最近変わったのかと思いきや3ヶ月ぐらい前のOAuth関連の記事とか見てもやっぱり http:// でした。

なんなんでしょう…。

OAuth覚え書き その2

先日のエントリー OAuth覚え書き で、エラーが発生したところで躓いたという記事を書きましたが、無事解決しました。

解決方法は下記。

Continue reading

OAuth覚え書き

追記 このエントリーでの問題は解決しました。 解決編はこちらからどうぞ。

twitterの認証方式にOAuthというものがあるとのことで、色々やってみることにしました。 とりあえずPHPでやってみます。 以下覚え書き(自分用メモなんでだいぶ端折ってます。わかりづらくてごめんなさい)。

参考ページ: PHP+OAuthでTwitter – SDN Project TwitterのbotをOAuthに対応させる – しばそんノート Sinatra と OAuth を使って Twitter のタイムラインを取得してみた – まちゅダイアリー(2009-08-18)

Continue reading

【PHP】 file_get_contentsで躓いた

会社でやってて躓いた(半月ほど前に

下記の /hoge.php を /fuga.php から呼び出すとして。

hoge.php

<?php
  echo 'hogafuge';
?>

fuga.php

<?php
  $file1 = file_get_contents('./hoge.php');
  $file2 = file_get_contents('http://unolabo.boo.jp/hoge.php');
?>

$file1 , $file2 それぞれの出力は、

echo $file1;

<?php
  echo 'hogafuge';
?>

echo $file2;

hogefuga

と、なるらしい。べんり

最初 $file1 のほうでやっててできません!てなったんだけど、 $file2 でやると出力結果が取れるんですよ、と言われました。(Apachがどうとかっていう説明と共に

でも、readfile(); でも同じなのかすら・・

とりあえず眠いのでまたこんど。

ホーム > PHP

Search
Feeds
Meta

Return to page top