用語が微妙におかしかったりすると思うのでご容赦ください。
perlプログラムにpdfファイルをアップする機能をサブルーチンとして追加させたいです。
アップする部分に関してはこちらのプログラムを参考にしようとしています。
http://www.tohoho-web.com/cgi/wwwupl2.txt
したいことを箇条書きにすると…
・アップするのは自分だけ・他にもいろいろな情報をアップしますが、この項目ではpdfファイルだけをアップ。
($append_suffix機能の排除・ファイル拡張子の固定等)
・ファイル名を記事Noで保存したい。
80行目くらいからファイル名を取得しているように思うのですが、この部分をすべてキャンセルして、指定のファイル名で保存できるようにしたい。
ファイル名はこのサブルーチンに入る前に作成する記事NO($no)を利用。
これについては、「# ボディ処理」の上でファイル名の指定を割り込ませたらそのファイル名でアップできていたので問題なくできるのではないかと思ってます。
#ここにファイル名割り込み
$filename = "";
$filename = "$fn-2.pdf";
($fnはテスト用に設定しただけです。組み込み先では$noを取得)
・「INPUT TYPE=file name="up2"」にファイル名が入力された時だけ動作させる
これについては、
if ($in{'up2'}) { &up2; }
でさせるのは良いんですけど、参考プログラムのwwwupl2をそのままサブルーチンで動作させると、送られる変数全部を繰り返しアップするような感じになりますよね。
(すみません表現がうまくできないです。
テストでwwwupl2を動作させたとき、ファイル名を固定させようとして「<input type="hidden" name="fn" value="01-2">」としてファイルを送信したのですが、送信結果にhiddenの分も掲載されてました。今回の物を組み込んだ際、題名や内容・日付・pdfファイルのサムネイル画像用jpgファイル等も同時に保存予定です。このままだとそれも全部繰り返しちゃいますよね?
up2にファイルが指定された時、この部分に関してのみアップロード作業を行う(?)という風にしたいです。)
用語もつたない状態ですが、これで何とか伝わるでしょうか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
あくまで、参考にどうぞ。
一切質問の内容を考慮しておりません。
アップロードファイルを指定するフォーム
up.html
とでも保存
lang
1<html> 2<head> 3 <meta charset="utf-8"> 4</head> 5<body> 6 7 <form enctype="multipart/form-data" method="post" action="up.cgi"> 8 <table border="1" cellspacing="2" bordercolor="#004080" cellpadding="3"> 9 <tr> 10 <td valign="top" align="center">アップロードするファイルの選択</td> 11 </tr> 12 <tr> 13 <td align="center"><input type="file" name="file"></td> 14 </tr> 15 <tr> 16 <td valign="top" align="center"><input value="アップロード" type="submit" name="submit"></td> 17 </tr> 18 </table> 19 <input type="hidden" value="0" name="edit"> 20 </form> 21 22</body> 23</html> 24
ポイントは<form>
タグに、enctype="multipart/form-data"
を指定すること。
ほか、アップしたい情報があるのであれば、<form>~</form>
の間に追記していく。
ファイルを受け取るCGI/perl
up.cgi
というファイル名で保存。
ファイル名を変更したい場合は、上記HTML<form>
タグ内の、action="up.cgi"
も合わせて変更すること。
lang
1#!/usr/local/bin/perl 2 3#書き出し宣言 4print "Content-type: text/html\n\n"; 5print '<meta charset="utf8">'; 6 7 8#使用するモジュールをロード 9use File::Basename; 10use File::Copy; 11use CGI; 12 13#転送できるファイルの最大サイズを設定 14#(実際は、post送信されるコンテンツ合計の最大サイズ) 15#この値は、CGIオブジェクトを作成する時には既に 16#設定されていなければならない 17$CGI::POST_MAX = 1024 * 1000; #max = 1MB 18 19 20#CGIオブジェクトを作成 21$form = new CGI; 22 23 24#クライアントにヘッダを送信 25#これは、結果メッセージ表示のため 26binmode STDOUT; 27 28 29#ファイルの転送のチェック 30if (!defined($filename) and $error = $form->cgi_error){ 31 print "ファイルが転送できませんでした:$error\n<br>"; 32 print 'ファイルのサイズが大きすぎます。<br>'; 33 print '1MBまでにしてください。<br>'; 34 exit; 35} 36 37 38#ファイルハンドル作成 39my $fh = $form->upload('file'); 40 41#ファイルの存在の確認 42my $fname = basename($form->param('file')); 43if ($fname eq "./"){ 44 print 'ファイルのアップロードに失敗しました<br>'; 45 exit; 46} 47 48#ファイルの保存 49my $newfile = $fname; 50 51#unlink("$newfile"); 52copy ($fh, "$newfile.txt"); 53undef $form; 54 55#権限変更 56#chmod 0600,"$newfile"; 57 58print "ファイル名「$newfile」で書き出し"; 59 60exit; 61
これで、ファイルのアップロードができます。
投稿2016/09/16 00:34
総合スコア2006
0
ベストアンサー
とほほさんのページは、さすがに情報が古い(12年前!)ので、
もう少し新しい情報を参考にしたほうが良いと思います。
今はこのような処理をするのはモジュールを使って行うのが一般的です。
下記の記事はモジュールを使って行う方法ですが、
これはそんなに新しい方法と言うわけでもありません。
ファイルアップロードの仕方
http://www.hidekik.com/cookbook/p2h.cgi?id=upload
・ファイル名を記事Noで保存したい。
とほほさんの方法でもモジュールを使う方法でも、
任意のファイル名を付けることは特に難しくありません。
送信されてきたデータはまだファイルになっていないので、
そのデータを取り出して任意のファイル名で保存すれば良いだけです。
・アップするのは自分だけ・他にもいろいろな情報をアップしますが、この項目ではpdfファイルだけをアップ。
・「INPUT TYPE=file name="up2"」にファイル名が入力された時だけ動作させる
フォームから送信した時点でデータは全てサーバーに送信されてしまうので、
サーバー側(PerlCGI側)で特定のデータだけアップロードしない、という操作はできません。
送信した時に、特定のデータだけ送るようにしたいとしたら、
それはPerl側ではなく、おそらくHTML+JavaScriptの範疇です。
JavaScriptなどのタグで別の質問にしたほうが良いと思います。
投稿2016/08/18 13:15
総合スコア9396
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。