4月 24

長いタイトルですな。

つまり、サーバ上でファイルを作って圧縮、ダウンロードは結構簡単にできるんです。ただ、ファイル生成しちゃうとファイル名をユニークにしなきゃいけなかったり、ファイルのダウンロードが終わったら削除しなきゃいけなかったり、気分的に手間なんですよね。タイミングによってはダウンロードが開始される前に削除されちゃったりして、びっくりでした。

で、オンメモリでCSVファイル作って圧縮、ダウンロードまでしてみました。まぁメモリが安くなったからこそできる技ですよね。CSVが小さければいいけど、昔はこんなこと怖くてできなかった。

require ‘rubygems’
require ‘zipruby’

data = “a,b,c\r\nA,B,C”
Zip::Archive.open_buffer(buffer, Zip::CREATE) do |arc|
  arc.add_buffer(“download.csv”,data)
end

send_data(buffer , :type=>’application/zip’, :filename => “download.zip”, :disposition=>’attached’)

オンメモリでCSVちゅーのはどうでもよくて、ポイントはZip::Archiveのadd_bufferでしょう。ziprubyのバージョンにもよりけりなのかもしれません。今回利用したのは0.2.9です。あとはsend_fileじゃなくてsend_dataを使うあたりですかね。

 

Tagged with:
4月 15

FPDIを利用します。「フリーで使っていいよ」と書いてあるのにPayPalのボタンが置いてあるのは、寄付はしてねっていうことですよね。会社のプロジェクトで利用することになったら経費で寄付してみようかと。

require ‘../var/fpdf/fpdi.php’;

$temp_pdf= new FPDI();
$_page = $temp_pdf->setSourceFile(‘../var/hoge.pdf’);
unset($temp_pdf);

for($i=1;$i<=$_page;$i++)
{
    $_write_pdf = new FPDI();
    $_write_pdf->setSourceFile(‘../var/hoge.pdf’);
    $_tmp_info = $_write_pdf->importPage($i);
    $_write_pdf->addPage();
    $_write_pdf->useTemplate($_tmp_info);
    $_write_pdf->Output(“hoge_”.$i.”.pdf”,”F”);
    unset ($_write_pdf);
}

unsetにはあまり意味はない、というかムダかもしれません。closeやdisposeが見当たらなかったので微妙に気持ち悪かったから入れただけです。解放してくれているのかなぁ。

ページ数の取得のために一度テンプレートとして読み込み、それからページ数分でループしてます。ループ処理の中で「テンプレートファイルのiページ目だけ読み込んでファイル書き出し」を繰り返しています。

これでやりたいことはできたのですが、なんかメソッド一発で分割してくれるのがありそうで怖い。あったらどなたか教えてください。

FPDIは1.2、FPDFは1.53、PHPは5.2、WindowsXP上のApache2.0で動作確認しました。

Tagged with:
4月 09

HTTPServiceであればそのままバインドしてしまうのが一番簡単なのですが、Flex側で加工して使いたいときもあります。そういうときはハセテツはArrayCollectionに格納してから加工して使います。FlexBuilder3.0、MacOSX、Safari3.2で動作確認しました。

<?xml version=”1.0″ encoding=”utf-8″?>
<response>
 <item>
  <id>1</id>
  <name>hoge1</name>
 </item>
 <item>
  <id>2</id>
  <name>hoge2</name>
 </item>
 <item>
  <id>3</id>
  <name>hoge3</name>
 </item>
 <item>
  <id>4</id>
  <name>hoge4</name>
</item>
</response>

上記がサンプルのXML、これがhttp://localhost.hoge.xmlだとします。

private var list_connect:HTTPService = new HTTPService();
private function init():void
{
  list_connect.url = “http://localhost/hoge.xml”;
  list_connect.addEventListener(ResultEvent.RESULT,load_data);
  list_connect.send();
}
private function load_data(event:ResultEvent):void
{
  var modelData:ArrayCollection = new ArrayCollection();
  itemData = event.result.response.item as ArrayCollection;
  for each(var item:Object in itemData)
  {
    trace(item.id + ” / ” + item.name);
  }
}

見たまんま、HTTPServiceの結果をArrayCollectionに入れてるだけです。簡単なんですけど、意外と手間取ったんですよね。。。

 

Tagged with:
4月 07

といっても、addChild/removeChildを使うだけなんですけどね。

複数のパーツを含んだコンテンツを追加する場合、addChildだとコンポーネントにしておかないとめんどくさいです。ので、ハセテツは先にすべてのコンテンツを作成しておいて、必要に応じてremoveChildというやり方です。

var obj:DisplayObject = this.accordion1.getChildByName(“hoge”);
this.accordion1.removeChild(obj);

accordion1にある「hoge」というコンテンツを削除します。

Visibleとかで切り替えられるのかと思っていたら、そう簡単にはいきませんでした。

Tagged with:
Get Adobe Flash playerPlugin by wpburn.com wordpress themes
preload preload preload