2009年2月10日火曜日

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

macで画像ファイルのアップロードが頻繁に失敗する問題について引き続き作業したので、メモしときます。
昨日までにmacのsafari上でHTTP1.1のKeep-aliveな通信を行ってサイズの大きなファイルをアップロードすると、高い確率で失敗するらしいということがわかりました。
家はロリポップのサーバを使っているので、apacheの設定が変えられないのでサファリを使っての解決策が思いつきませんでした。
そこでsafariを使わないで画像をアップロードする方法をとることにしました。
使ったのはapplescript+curlです。
applescriptからシェルのコマンドを呼び出せるので、unixのcurlコマンドを使ってファイルの転送を行います。送られたフォームデータをサーバ側でPHPで使って記事の登録をします。

参考にしたのは
ドラッグ&ドロップでFC2ブログに複数の画像をまとめてアップロードするAppleScriptです。というか、ほとんどコピーです。
applescriptも初めてで、殆ど理解してませんが、手探りでなんとかなりました。
スクリプトをアプリとして保存して、画像ファイルをドラッグ&ドロップすると、投稿先を選択するダイアログが出て、ドラッグした画像を適当に縮小してサーバに送信します

ほんとうは画像のタイトルも入れられるようにしたかったのですが、日本語が化けるので止めました。エンコードするとかなんかが必要なんだと思います

これでiPhotoからドラッグして画像の送信ができるようになりました。
「こういうことが出来るのがmacの良いとこだね」と嫁さんに言ったけど理解してもらえませんでした。





property msg1 : "管理画面のパスワードを入力" as Unicode text
property msg2 : "終了しました。" as Unicode text
property msg3 : "ログインに失敗しました。" as Unicode text

on open drop
activate me
--display dialog msg2 default button 1 buttons "Start"
----メインループ
repeat with theFile in drop
set theFile to theFile as string
set upFile to getBaseName(theFile)
--set drslt to display dialog "画像ファイル: " & upFile & " を送信します
--タイトル:" default answer "" buttons {"投稿", "キャンセル"} default button 2
--set btn to button returned of drslt
--
--if btn = "キャンセル" then
-- return 0
--end if
--set title to text returned of drslt
set title to ""

set caption to "画像ファイル: " & upFile & " を送信します
投稿先を選択して下さい"
set caption to "投稿先を選択して下さい"
set choices to {"混合技法", "水彩画", "日本画"}
set crslt to choose from list choices default items "水彩画" with prompt caption

if crslt = false then return 0
set crslt to contents of item 1 of crslt
if crslt = "混合技法" then
set category to "6"
else if crslt = "水彩画" then
set category to "7"
else if crslt = "日本画" then
set category to "8"
end if

set upFile to "/xxx/" & upFile
process_item(theFile, upFile)
tell application "Finder"
set fPath to POSIX path of theFile as Unicode text
set uploadScript to "curl -u " & myID & ":" & myPass & " -L " & myURL & " -F \"upload=@" & upFile & "\" -F category=" & category & " -F title=\"" & title & "\""
--set response to uploadScript
set response to do shell script uploadScript
----パスワードの入力フォームがレスポンスに含まれていた場合、ログイン失敗と判定(ちょっとこのへんが微妙…)
if response contains "401" then
beep
display dialog msg3 with icon 0 buttons "OK" default button 1
error number -128
end if
display dialog response buttons "OK" default button 1
end tell
end repeat
beep
--display dialog msg2 default button 1 buttons "OK"
end open

on process_item(this_item, newFile)
try
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 as JPEG in file newFile
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
return newFile
end process_item

on getBaseName(itemName)
set org_delimi to text item delimiters of AppleScript -- オリジナルの区切り文字をとっておく

set text item delimiters of AppleScript to ":" -- "、"で区切る
set num to count text item of itemName
set newName to text item num of itemName as string
set text item delimiters of AppleScript to org_delimi -- 操作終了後にオリジナルの区切り文字に戻す

return newName
end getBaseName

0 件のコメント: