質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

Q&A

解決済

2回答

5021閲覧

smartyにてディレクトリにファイルをアップロードする処理

amaguri

総合スコア227

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

0グッド

0クリップ

投稿2016/12/15 08:47

smartyにてやりたいこと
①html側 フォルダを選択して確認ボタンを押したら②に遷移
①php側 とくになし

② html側 ファイル名前を表示し
これを送信するか、しないかの確認
はい を押下で③に いいえ を押下で①へ

または
ファイルが選択されてなかった場合
ファイルが選択されていません を表示
アップロード失敗した場合
アップロードが失敗しました を 表示

②php側 empty("file_name")でファイルが選択されてない場合はファイルが選択されていない旨を表示するようhtml側にメッセージを渡す。
仮ディレクトリ(var/www/data(絶対パス))にファイルをアップロードする
アップロードに失敗した場合
アップロードに失敗したメッセージをhtml側に渡す

③html側 ファイルの送信を完了しました。
移動に失敗した場合
エラーが起きましたと表示する。

③php側 仮フォルダから本フォルダ(var/www/truedatas(絶対パス))
にファイル名をaaaにリネームして移動させる。
移動に失敗した場合html側にメッセージを渡す。

ということをやりたいのですが
今回わからないことが

・ディレクトリにファイルのアップロードのやり方がわかりません。

条件として①にて確認を押されたら
②の処理のテンプレートとphpにてファイルアップロードが走るようにしなくてはいけません。

次に
格納されたそのファイルをリネームをして
別のディレクトリに移動させるやりかたがわかりません。

この判断としては格納したファイルの名前を取得して
仮ディレクトリからそのファイルを探しaaaにリネーム、本フォルダに移動移動するという流れになるのでしょうか

長くなりましたが
ディレクトリにファイルをアップロードするやり方と
ディレクトリからディレクトリにファイルをリネームして移動する
やり方を教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

#サンプルコード

要件に合わせて、改変してください。

php

1<?php 2 3/** 4 * index.php 5 */ 6require 'common.php'; 7 8// Smrtyをインスタンス化 9$smarty = new Smarty(); 10 11// アップロード時 12if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') { 13 14 $upload = $_FILES['upload']; 15 16 // アップロード失敗時 17 if ($upload['error'] > 0) { 18 $smarty->assign('error', uploadError($upload['error'])); 19 } 20 // アップロード成功時 21 else { 22 23 // 書き込みディレクトリ存在チェック 24 if (!file_exists(UPDIR) && !mkdir(UPDIR, 0660, TRUE)) { 25 $smarty->assign('error', '保存先ディレクトリの作成に失敗しました。'); 26 } 27 // 書き込み権限 28 else if (!is_writable(UPDIR)) { 29 $smarty->assign('error', '保存先ディレクトリに書き込み権限がありません。'); 30 } 31 32 // バリデーション 33 $filename = $upload['tmp_name']; 34 35 // 拡張子取得 36 $ext = checkFileType($filename); 37 38 // ファイルタイプのチェック 39 if (!$ext) { 40 $smarty->assign('error', '許可されていないファイルタイプです。'); 41 } 42 43 // バリデーション通過時 44 if (null == $smarty->getTemplateVars('error')) { 45 46 $basename = sprintf('%s.%s', uniqid(), $ext); 47 $destination = sprintf('./%s/%s', UPDIR, $basename); 48 49 move_uploaded_file($filename, $destination); 50 } 51 } 52} 53 54$smarty->display('index.tpl');

php

1<?php 2 3/** 4 * common.php 5 */ 6ini_set('display_errors', 1); 7error_reporting(E_ALL); 8 9require 'vendor/autoload.php'; 10 11// アップロードしたファイルの格納ディレクトリ 12define('UPDIR', 'upload'); 13 14/** 15 * エラー種別の判定をする 16 * @param type $errorNumber 17 * @see http://php.net/manual/ja/features.file-upload.errors.php 18 */ 19function uploadError($errorNumber) 20{ 21 switch ($errorNumber) { 22 case UPLOAD_ERR_INI_SIZE: // 1 23 $err = 'アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています。'; 24 break; 25 case UPLOAD_ERR_FORM_SIZE: // 2 26 $err = 'アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています。'; 27 break; 28 case UPLOAD_ERR_PARTIAL: // 3 29 $err = 'アップロードされたファイルは一部のみしかアップロードされていません。'; 30 break; 31 case UPLOAD_ERR_NO_FILE: // 4 32 $err = 'ファイルはアップロードされませんでした。'; 33 break; 34 case UPLOAD_ERR_NO_TMP_DIR: // 6 35 $err = 'テンポラリフォルダがありません。PHP 5.0.3 で導入されました。'; 36 break; 37 case UPLOAD_ERR_CANT_WRITE: // 7 38 $err = 'ディスクへの書き込みに失敗しました。PHP 5.1.0 で導入されました。'; 39 break; 40 case UPLOAD_ERR_EXTENSION: // 8 41 $err = 'PHP の拡張モジュールがファイルのアップロードを中止しました。'; 42 break; 43 } 44 return $err; 45} 46 47/** 48 * ファイルタイプのチェック 49 * @param type $filename 50 */ 51function checkFileType($filename) 52{ 53 $finfo = finfo_open(FILEINFO_MIME_TYPE); 54 $filetype = finfo_file($finfo, $filename); 55 finfo_close($finfo); 56 57 // 許可するMIME_TYPEを列挙 58 $allowed = [ 59 'jpg' => 'image/jpeg' 60 , 'png' => 'image/png' 61 , 'gif' => 'image/gif' 62 ]; 63 64 return array_search($filetype, $allowed); 65}

html

1{* 2 * index.tpl 3 *} 4<!DOCTYPE HTML> 5<html lang="ja"> 6 <head> 7 <meta charset="UTF-8"> 8 <title>ファイルアップロード</title> 9 </head> 10 <body> 11 12 {if $error|default:null != null} 13 <p>{$error}</p> 14 {/if} 15 16 <form action="" method="post" enctype="multipart/form-data"> 17 <p> 18 <label for="upload">ファイル</label> 19 <input type="file" name="upload" id="upload" /> 20 </p> 21 <p> 22 <button>SUBMIT</button> 23 </p> 24 </form> 25 </body> 26</html>

投稿2016/12/16 03:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2016/12/16 05:11

今回一度画面が切り替わるので 以前回答いただきました。 フォルダに一度格納して 次の画面でフォルダの移動を行いたいと思うのですが ②のphpで仮フォルダに一度格納 ③の時に ②で仮フォルダに格納されているファイルをリネームして入れるにもこのコードでいいのでしょうか? このコード読ませていただいたのですが 1画面での操作によって uproadフォルダへのアップロードを様々なチェックを得て格納している と読み解いたのですが、、
退会済みユーザー

退会済みユーザー

2016/12/16 05:31 編集

要件に合わせて改変してください。 読んで動きがわからないのであれば、動かして見てください。
amaguri

2016/12/16 06:36

改変すべきところがわかったので試してみたいと思います!
guest

0

ベストアンサー

テンプレート側のフォームタグを

html

1<form method="post" action="xxx.php" enctype="multipart/form-data">

のようにしてPHPで

PHP

1move_uploaded_file($_FILES['up_file']['tmp_name'],"./".$_FILES['up_file']['name']

のようにすればよいと思われます。

ファイルの移動やリネームについては

PHP

1rename("/tmp/file.txt", "/home/hoge/dir/file.txt");

でよいのではないでしょうか?

投稿2016/12/15 09:32

s.t.

総合スコア2021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2016/12/16 00:14

ありがとうございます試してみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問