2009年2月8日日曜日

macでファイルのアップロードができない

忘れないうちに書いときます

macで画像ファイルをアップロードできなかった原因を調べてみると、2種類あるようでした。
ひとつはアップロードは完了しているけど画像ファイルにエラーがあってPHPがエラーとなってしまう事が原因。
二つ目はアップロードが完了しないことがある
ということでした。最初の画像ファイルのエラーはiphotoで編集したファイルは、ファイルサイズが2倍くらいになっていて、受信したデータをPHPのImageCreateFromJPEG()関数でImageが生成できてませんでした。
これはjpegファイルをmac上でリサイズして再生すると解決できました。
リサイズは自動化したいので、
ImageMagickのconvertコマンドを使うことにして
ImageMagick (RMagick)をMacにインストールを参考に、ImageMagicをインストールしました。

まずXCodeをOSのインストールCD2枚目を使ってインストール
sudo port install jpeg
sudo port install libpng
sudo port install libwmf
sudo port install tiff
sudo port install lcms
sudo port install freetype
sudo port install ghostscript

で必要なライブラリ等をインストール。途中でlibwmfのインストールがエラーで終わってしまったけど、wmfは関係ないから無視して続行しました。(いいのかな?)

imagemaigickもportでインストールできました
sudo port install imagemaigick

インストールの作業はmakeに結構時間がかかったので(数十分だったと思う)別のアプローチを探して見ました

AppleScriptを使う方法
AppleScriptを使うと、特定のフォルダに対しての操作をトリガとして、スクリプトを実行することができるらしい。サンプルで用意されたスクリプトの中にフォルダに画像ファイルを入れると自動的に回転させるというのがあったので、これを改造してサイズを変更するように新しいスクリプトを作りました

中身はまったく理解してないですが、回転させているところを
scale this_image to size 1000
に書き換えて同じフォルダに保存しました


(*

Image - Resize 1000

*)


property done_foldername : "Resized Images"

-- the list of file types which will be processed

-- eg: {"PICT", "JPEG", "TIFF", "GIFf"}

property type_list : {"JPEG", "TIFF", "PNGf"}

-- since file types are optional in Mac OS X,

-- check the name extension if there is no file type

-- NOTE: do not use periods (.) with the items in the name extensions list

-- eg: {"txt", "text", "jpg", "jpeg"}, NOT: {".txt", ".text", ".jpg", ".jpeg"}

property extension_list : {"jpg", "jpeg", "tif", "tiff", "png"}



on adding folder items to this_folder after receiving these_items

-- CHECK FOR THE DESTINATION FOLDER WITHIN THE ATTACHED FOLDER

-- IF IT DOESN'T EXIST, THEN CREATE IT

tell application "Finder"

if not (exists folder done_foldername of this_folder) then

make new folder at this_folder with properties {name:done_foldername}

set current view of container window of this_folder to list view

end if

set the target_folder to folder done_foldername of this_folder

end tell

-- PROCESS EACH OF THE ITEMS ADDED TO THE ATTACHED FOLDER

try

repeat with i from 1 to number of items in these_items

set this_item to item i of these_items

set the item_info to the info for this_item

-- CHECK TO SEE IF THE ITEM IS AN IMAGE FILE OF THE ACCEPTED FILE TYPE

if (alias of the item_info is false and the file type of the item_info is in the type_list) or (the name extension of the item_info is in the extension_list) then

tell application "Finder"

-- LOOK FOR EXISTING MATCHING ITEMS IN THE DESTINATION FOLDER

-- IF THERE ARE MATCHES, THEN RENAME THE CONFLICTING FILES INCREMENTALLY

my resolve_conflicts(this_item, target_folder)

-- MOVE THE ITEM TO THE DESTINATION FOLDER

set the target_file to (move this_item to the target_folder with replacing) as alias

end tell

-- PROCESS THE ITEM

process_item(target_file)

end if

end repeat

on error error_message number error_number

if the error_number is not -128 then

tell application "Finder"

activate

display dialog error_message buttons {"Cancel"} default button 1 giving up after 120

end tell

end if

end try

end adding folder items to


on resolve_conflicts(this_item, target_folder)

tell application "Finder"

set the file_name to the name of this_item

if (exists document file file_name of target_folder) then

set file_extension to the name extension of this_item

if the file_extension is "" then

set the trimmed_name to the file_name

else

set the trimmed_name to text 1 thru -((length of file_extension) + 2) of the file_name

end if

set the name_increment to 1

repeat

set the new_name to (the trimmed_name & "." & (name_increment as string) & "." & file_extension) as string

if not (exists document file new_name of the target_folder) then

-- rename to conflicting file

set the name of document file file_name of the target_folder to the new_name

exit repeat

else

set the name_increment to the name_increment + 1

end if

end repeat

end if

end tell

end resolve_conflicts


-- this sub-routine processes files

on process_item(this_item)

-- NOTE that the variable this_item is a file reference in alias format

-- FILE PROCESSING STATEMENTS GOES HERE

try

-- convert alias reference to string

set this_item to this_item as string

with timeout of 900 seconds

tell application "Image Events"

launch -- always use with Folder Actions

set this_image to open file this_item

scale this_image to size 1000

save this_image with icon

close this_image

end tell

end timeout

on error error_message

tell application "Finder"

activate

display dialog error_message buttons {"Cancel"} default button 1 giving up after 120

end tell

end try

end process_item

つづく...

0 件のコメント: