• 締切済み

ファイルアップロードしたものをセッションに保存

$_FILESでアップロードされた画像ファイルをセッションに保存し、 確認画面で確定されるとファイルとして保存するという処理を 作成したいのですが、 どのようにすればいいのでしょうか? ファイルサイズは20MBくらいです。

  • PHP
  • 回答数2
  • ありがとう数1

みんなの回答

回答No.2

> 仮ファイルがのこってしまいます。 確かに。 私の場合はテンポラリディレクトリに残っているファイルをサーチしてfilemtimeで1日以上前のものを削除するようにしています。

angelinaane
質問者

お礼

やはりそのような処理になりますよね。 というわけで、 普通に tmp_nameのファイル内容をfreadで読込み、セッションに保存。 確定時、セッション内容をfwriteで特定ファイル名で保存。 という処理にすることにしました。 なにか不具合でなければいいんですけれどね。 ありがとうございました。

回答No.1

セッション変数にそのままファイルが格納出来るかどうかはわかりません(やろうと思った事もありません)。 一般的にはアップロードされた画像を一時ファイル(テンポラリ)として扱えば良いのではないでしょうか。 すなわち、アップロードされたファイルに仮に名前をつけて、その仮の名前をセッション変数に格納します。アップロードされたファイルには最初からtmpnameがありますから、それを使うのが楽かと。 確定したら、格納されている仮の名前を正規のファイル名にリネームすれば良いと思います。

angelinaane
質問者

補足

回答ありがとうございます。 私もその方法をはじめは考えたのですけれど それだと通常の流れであればいいのですが 結局確定しなかったり、途中でブラウザを閉じられたりするときに 仮ファイルがのこってしまいます。 そのためセッションなら期限が切れたら消えるかなと思ったのです。

関連するQ&A

  • ファイルのアップロードについて

    画像ファイルをフォームからアップロードしているのですが どうやっていものかわからないことがあります。 まずは、アップするファイルを選択してもらいファイルサイズや 拡張子チェックに問題がなければ他の項目にエラーがあっても move_uploaded_file関数で一時保存フォルダに画像を保存しています。 一時保存フォルダにアップされた画像は後々タイプスタンプで経過 時間を取得し1日以上経過しているものについては削除するので タイムスタンプの値をファイル名にしています。 全ての項目にエラーもなく確定となった場合にはrename関数で 一時保存フォルダから正式な保存フォルダへファイルを移動しています。 ソースをまとめると // 一時ファイル保存フォルダ $tempdir = '../../upload/temp/'; // 一時保存のファイル名 $mktime = mktime(); $tempname = $mktime . '.jpg'; // ファイル正式保存フォルダ $filedir = '../../upload/image/'; // 正式保存のファイル名 $mictime = microtime(); $filename = substr($mictime, 11) . substr($mictime, 2, 6) . '.jpg'; if (isset($_POST['submit'])) { if ($_FILES['file']['size'] == 0) { // サイズが0なのでエラー } if ($_FILES['file']['error'] == UPLOAD_ERR_OK) { // サイズチェック2 if ($_FILES['file']['size'] > 1024*1024) { // 規定サイズ以上なのでエラー } if (画像に関するエラーがなければ) { // move_uploaded_fileで一時保存フォルダへアップロード } } if (全ての項目にエラーがない場合) { // rename関数で一時保存フォルダから正式な保存フォルダへ移動 } というようにしています。 $_FILEは保持できないので一度でもファイルをアップロードしても 他の項目にエラーがある限りリセットされてしまいサイズが0バイトと なるのでエラーチェックに引っかかり何度も選択しなくてはなりません。 一時保存フォルダに保存されたら再度ファイルを選択しアップロード しない限り他の項目にエラーがあってもファイルのエラーチェックを 通し一時保存フォルダの画像をサムネイル画像としてページ上に表示 させたいのですがどうすればいいのでしょうか? 自分なりに調べてみたのですが参考情報や解決策がみつかりませんでした。 詳しい方がおりましたら宜しくお願い致します!

    • 締切済み
    • PHP
  • ファイルのアップロード処理を確認画面で確認後にアップロードするようにし

    ファイルのアップロード処理を確認画面で確認後にアップロードするようにしたいのですが、プログラムの書き方がわかりません。確認画面を通さずにやればアップロードできるのですが。どうすればいいのか教えてもらえるとうれしいです。 流れとしては「アップロード画面でファイルを指定」→「確認画面でアップロードボタンを押す」→「アップロード結果画面」です。作成中のソースは以下のようになっています。 ■upload.html(アップロード画面) <html><head><title>アップロード画面</title></head><body> <form action="kakunin.php" method="post" enctype="multipart/form-data"> ファイル:<br> <input type="file" name="upfile" size="30"><br> <input type="submit" value="確認画面へ"> </form></body></html> ■kakunin.php(確認画面)<未完成> <html><head><title>確認画面</title></head><body> <?php $upfile=$_POST['upfile']; print "選択したファイル: $upfile<br>\n"; ?> <br>この内容でよろしいですか?<br> よろしければ「アップロード」ボタンを押してください。<br> <form action="uploadkekka.php" method="post" enctype="multipart/form-data"> <input type="submit" value="アップロード"> </form></body></html> ■uploadkekka.php <html><head><title>アップロード結果</title></head><body> <p><?php if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "uploadfiles/" . $_FILES["upfile"]["name"])) { chmod("uploadfiles/" . $_FILES["upfile"]["name"], 0644); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできませんでした。"; } } else { echo "ファイルが選択されていません。"; } ?> </p></body></html>

    • ベストアンサー
    • PHP
  • ファイルのアップロードとObjectDisposedException

    お世話になります。 現在ASP.NETで開発を行っており、ファイルのアップロードをINPUTのFile属性のコントロールから行う処理で 一定のサイズ以上のファイルをサーバーにアップロードできないという問題に直面しています。 お手数ですが、皆様のお力をお貸し願えればと思います。 画面は以下のような構成になっています。 一覧メニュー画面 ⇒ メニューから選んだデータの詳細画面 ⇒ファイルアップロード用のポップアップ 処理の仕様としては (1)ポップアップを開き、FileInputコントロールからアップロードしたいファイルを選択し、 (最大5つアップロードできる仕様となっています。小さなポップアップに FileInputコントロールが5つ並んでいるイメージです) ポップアップのOKボタンが押されるとポップアップ画面が閉じます。 ※この地点ではサーバー側にファイルはアップロードされません。 (2)詳細の画面でデータを入力後、確定ボタンを押した地点で ポップアップに入力されたファイルをサーバー側にアップロードします。 (1)から(2)に遷移する際、ポップアップで入力されたファイルのパスを保持するため、 DatatableのインスタンスにHtmlInput型のカラムを作成し、 ファイル名、ファイルパス、ポストされたファイルの情報を保持しています。 その後、ポップアップの画面が閉じると同時に、セッションにデータテーブルを格納し、 詳細画面の確定ボタン押下時にセッションからデータテーブルを取り出し、HttpPostedFileとして宣言した変数に該当するカラムを格納し、 アップロードしています。 この際、ローカルでデバッグする場合には特に問題はないのですが、 Webサーバーにてテストを行うと100kb前後のファイルをアップロードしようとした際に ObjectDisposedExceptionが発生し、アプリケーションが落ちます。 ------------------------------------------------ Dim datatable As New DataTable datatable = Session.item("ポップアップで入力されたFileInputのPostedFileを保持したデータテーブル") For i as integer = 0 to datatable.rows.count -1 Dim posted As HttpPostedFile = datatable.rows(i)("PostedFileが格納されたカラム") If Not posted.FileName = "" Then posted.SaveAs( _ "c:\UploadedFiles\" _ & System.IO.Path.GetFileName(posted.FileName)) End If Next ----------------------------------------------- このような形でコーディングしています。 ObjectDisposedExceptionが発生する地点は恐らくはSave Asの直後です。 (Webサーバーで動かしているためデバッグができません・・・) Save Asの直後に数秒のウェイトを置くとアップロードできるケースも 確認できました。 (ファイルのアップロードが終了する前にオブジェクトが破棄されるために発生しているのかな・・・とも思いましたがはっきりと特定はできていません) 長くなりましたが質問です。 (1)データテーブルにPostedFileを格納し、セッションに入れて データを持ちまわることはできるものなのでしょうか? ⇒50kb前後のファイルならアップロードができることから、 これ自体は問題ないのでしょうが、何か問題があればお知恵をお貸し下さい。 (2)アップロードしたファイルがアップロード完了した。という確認を取ることは可能でしょうか? ⇒サーバー上のファイルサイズとPostedFileのサイズを比較し、 同一サイズなら終了という手段も考えましたが、 サーバー上のアップロードしているファイルはロックされているせいか サイズを読み取ることができません。 ロック状態でも、(または他に何か原因があるのかもしれませんが・・) データサイズが読み取れる手段があればご教示願います・・・。 以上です。よろしくお願いします。

  • 画像アップロードについて

    いつもお世話になっております。 画像アップロード機能を作成し、問題なくアップロードを行うことができたのですが、 ある一定サイズ(約2MB)を超えるとアップロードが行われない現象が発生しました。 アップロードした画像は既定のサイズにリサイズして保存する仕様となっているのですが アップロード自体が行われないため、困っています。 以下【該当処理抜粋】------------------------------------------------------------- // ファイル名を設定する $fname = "hoge.jpg"; // 画像の幅・高さを設定する【規定値】 $w_size = "150"; $h_size = "100"; $tmp_name = $_FILES[$fname]['tmp_name']; // 画像ファイル名 $filename = "./hoge/".$fname; if (is_uploaded_file($tmp_name)){ $type = $_FILES[$fname]['type']; if ($type == "image/jpeg" || $type == "image/pjpeg") { // 画像ファイル存在チェック if(file_exists($filename)){ // ファイルが存在する場合は削除する unlink($filename); } // 画像ファイル名でアップロードをおこなう move_uploaded_file($tmp_name, $filename); // 画像ファイルのサイズを取得する list($sw, $sh) = getimagesize($filename); $src = imagecreatefromjpeg($filename); $dst = imagecreatetruecolor($w_size, $h_size); // 画像ファイルを既定サイズにリサイズする imagecopyresized($dst, $src, 0, 0, 0, 0, $w_size, $h_size, $sw, $sh); imagejpeg($dst, $filename); echo $fname[1]."ファイルのアップロードが完了しました。<br>"; }else{ echo $fname ."ファイルの画像形式が正しくありません。<br>"; } }else{ echo $fname ."ファイルはアップロードされませんでした。<br>"; } ---------------------------------------------------------------------------------------------------- 現象について調べたところ、PHPにはアップロードサイズが設定されている(デフォルト2MB)ため サイズの大きいファイルはアップロードできないようです。 サーバーはロリポップでレンタルしているためphp.iniの設定を変更ができません。 画像自体を事前にリサイズしてアップロードを行えば問題ないのですが、 今後、一般の方にも公開を予定してまして、リサイズ方法が分からない人(そのようなソフトがない人)にも 操作できるようにデジカメで撮った写真をそのままアップロードできる形式にしたいと考えています。 何かいい方法があればご教授願います。 【環境】 PG:php4.3.11 WEB:Apache

    • 締切済み
    • PHP
  • ファイルのアップロードができません

    今日始めたばかりの初心者です。 PHPだとCGIに比べ、ファイルのアップロードとか画像の処理が簡単に行えそうなのでチャレンジしてみたのですが、いきなりつまづいてしまいました。 とりあえずファイルをアップロードしてみようと思い、下のようなサンプルをアップロードしてみたのですが、さっぱり動きません。 適当なjpgファイルをアップロードすれば、スクリプトのあるディレクトリに”aaa.jpg”という名前で保存すると思うのですが…。 最後の”var_dump($_FILES);”という命令で、アップロードされたファイルの内容を表示させてるはずなのですが、ファイル送信前も後も”array(0) {}”としか表示されません。 PHPのバージョンは4.34です。 どなたかご教授お願いします。 ************************ <form enctype="multipart/form-data" method="post"> Upload File:<input name="userfile" type="file"> <input type="submit" value="Send File"> </form> <pre> <?php if (!empty($_FILES)) { move_uploaded_file($_FILES['userfile']['tmp_name'],'aaa.jpg'); } var_dump($_FILES); ?> </pre> ************************

    • ベストアンサー
    • PHP
  • セッション管理

    file1.html内でアップロードされた画像をabc.phpに送り、 そのabc.php内でfile1.htmlでアップロードされた画像の編集処理を行う プログラムを組みました。 編集処理には1分かかります。 ユーザAの画像を編集処理中の 編集処理時間1分間の間にユーザB、ユーザCがfile1.htmlでファイルをアップロードしabc.phpに処理を求めてきた時、 ユーザB、ユーザCのブラウザに対し 「あなたは1人目の処理待ちユーザです」 「あなたは2人目の処理待ちユーザです」 といったような順番待ち表示をセッション管理を応用して表示させたいです 。 下のセッション管理プログラムを応用して順番待ち表示を行なう事はできないでしょうか? 編集処理のプログラムは組めています。 <?php session_start(); if (!isset($_SESSION["visited"])){ print('0'); $_SESSION["visited"] = 1; $_SESSION["date"] = date('c'); }else{ $visited = $_SESSION["visited"]; $visited++; print($_SESSION["visited"]); $_SESSION["visited"] = $visited; $_SESSION["date"] = date('c'); } ?>

    • 締切済み
    • PHP
  • jQueryでファイルアップロード

    お世話になります。 jQueryでファイルアップロードの処理をしたいのですがやり方を教えて下さい。 Googleで検索すると色んなプラグインが出てくるのですが全体像がわからない為上手く動作してくれません。 やりたいのは、入力画面-->確認画面-->結果確認画面と遷移させてファイルをアップロードする処理です。 <画面仕様> (1)入力画面 ・氏名等の入力とアップロードするファイルの選択 ・アップロードファイルサイズのチェック (2)確認画面 ・入力画面で入力した内容の確認 ・アップロードするファイルの確認(個数、合計サイズ) (3)結果確認画面 ・アップロード処理結果の確認 ※実際のアップロードが入力画面でファイルを選択した直後に行われても構わない 嵌っているのは、入力画面でFORMのonsubmitと<input type="file">の両方を同時に設定できない事です。 FORMのonsubmitでは入力内容のチェックを、<input type="file">ではファイルのアップロードを行い、アップロードしたファイル名を隠しフィールドで確認画面に送りたいのですが、個々に指定するとそれなりに動くのに両方指定するとsubmitが優先されてしまい、<input type="file">のchengeイベントが動きません。 どうしたら良いかご教示下さい。 中途半端なソースですが、入力画面で私がやりたいことをコードにしてみました。 よろしくお願いします。 $(function() { $('#fileId').change(function() { $(this).upload('upload.php', function(res) { $(res).insertAfter(this); }, 'html'); }); }); <form id="form1" name="form1" action="confirm.php" method="post" enctype="multipart/form-data" onsubmit="return error_check();"> <input type="file" name="upload_file1" id="fileId" />

  • セッションを利用したファイルの受け渡し

    セッションを利用してデータベースにデータを登録するプログラムを作成しており、 画像のアップロード部分の処理で困っております。 画像がある場合は画像URLを登録、ない場合は空にしたいのですが、 下記のソースの問題点や解決策がお分かりになる方、ぜひご教示ください。 ■submit.php ・ ・ if(empty($error)){ if(isset($_FILES)){ $image = date('YmdHis') . $_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], 'picture/' . $image); //パターン1 $_SESSION['image'] = $image; } //パターン2 $_SESSION['image'] = $image; header('Location: check.php'); } ・ ・ <input type="file" id="image" name="image" /> <input type="submit" value="確認する" /> ・ ・ ■check.php if(isset($_SESSION['image'])){ echo '<img src="picture/' . $_SESSION['image'] . '" />'; } else { echo '写真のアップロードはありません。'; } ・ ・ <input type="submit" value="登録する" /> パターン1の場合 画像があっても無くても、「写真のアップロードはありません。」となりデータベースへの登録も空となります。 パターン2の場合 画像がある場合は、正常に「date('YmdHis')[imageの名前].jpg」が表示されデータベースに登録できます。 画像がない場合、check.php上では、<img src="picture/[date('YmdHis')の部分]のみ" />で表示され、date('YmdHis')の文字列がデータベースに登録されてしまいます。

    • ベストアンサー
    • PHP
  • PHPで音楽ファイルのアップロード

    ファイルをHTMLのINPUTでファイルを選択し、 アップロード後、メールに添付して送信を行おうとしているのですが、 音楽ファイル(weve,mp3等)がアップロードできません。 画像ファイルはアップロード・添付してメール送信できるのですが、音楽ファイルは使用する関数等が 異なるのでしょうか? $uploadfile1_size = $_FILES['uploadfile1']['size']; $uploadfile1_name = $_FILES['uploadfile1']['name']; $uploadfile1_tmp = $_FILES['uploadfile1']['tmp_name']; $uploadfile1_tmpを出力しても何も表示されないため、アップロードからできていないと思いますが分かりません。 どうか教えて下さい。よろしくお願いします。

    • 締切済み
    • PHP
  • アップロードしたファイルの絶対パス

    画像がアップロードできる掲示板をつくっています。 内容を記入して投稿する前にプレビューできるようにしたのですが ファイルの絶対パス(c:\なんとかかんとか\gazou.jpgのようなアドレス)が取得でず困っています。 まずフォームからの内容を $file_name= $_FILES['sendfile']['name']; で受け取ってみました。 その後 $_SESSION['sendfile'] = $file_name; という風にセッションに入れて別の確認ページに 飛ばすという形にしてみたのですが、 こうするとファイル名だけが取得できました。 絶対パスを取得するには「realpath()」を使うと書籍などにも書かれていたので $file_name = realpath($_FILES['sendfile']['name']); としたり $_SESSION['sendfile'] = realpath($file_name); としたりしてみたのですが どうもうまく行きませんでした。 根本的に使い方がまちがっているのでしょうか? アドバイスよろしくおねがいします。

    • ベストアンサー
    • PHP

専門家に質問してみよう