From fa4827f382cc999ce6fd5df3bc8d6455296cb93c Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 21 May 2020 22:33:27 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AE=E3=82=B3=E3=83=B3=E3=83=88=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=A9=E3=83=BC=E3=81=A8=E3=81=8B=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/SettingController.php | 32 ++++++++++++++++++ app/Utilities/Formatter.php | 39 ++++++++++++++++++++++ resources/views/setting/base.blade.php | 2 ++ resources/views/setting/import.blade.php | 32 ++++++++++++++++++ routes/web.php | 2 ++ 5 files changed, 107 insertions(+) create mode 100644 resources/views/setting/import.blade.php diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php index c1e8283..6a975fd 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/SettingController.php @@ -3,7 +3,9 @@ namespace App\Http\Controllers; use App\DeactivatedUser; +use App\Exceptions\CsvImportException; use App\Services\CheckinCsvExporter; +use App\Services\CheckinCsvImporter; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -72,6 +74,36 @@ class SettingController extends Controller return redirect()->route('setting.privacy')->with('status', 'プライバシー設定を更新しました。'); } + public function import() + { + return view('setting.import'); + } + + public function storeImport(Request $request) + { + $validated = $request->validate([ + 'file' => 'required|file' + ], [], [ + 'file' => 'ファイル' + ]); + + $file = $request->file('file'); + if (!$file->isValid()) { + return redirect()->route('setting.import')->withErrors(['file' => 'ファイルのアップロードに失敗しました。']); + } + + try { + set_time_limit(0); + + $importer = new CheckinCsvImporter(Auth::user(), $file->path()); + $importer->execute(); + + return redirect()->route('setting.import')->with('status', 'インポートに性交しました。'); + } catch (CsvImportException $e) { + return redirect()->route('setting.import')->with('import_errors', $e->getErrors()); + } + } + public function export() { return view('setting.export'); diff --git a/app/Utilities/Formatter.php b/app/Utilities/Formatter.php index 6098388..c0401c9 100644 --- a/app/Utilities/Formatter.php +++ b/app/Utilities/Formatter.php @@ -92,4 +92,43 @@ class Formatter return implode(',', $srcset); } + + /** + * php.ini書式のデータサイズを正規化します。 + * @param mixed $val データサイズ + * @return string + */ + public function normalizeIniBytes($val) + { + $val = trim($val); + $last = strtolower(substr($val, -1, 1)); + if (ord($last) < 0x30 || ord($last) > 0x39) { + $bytes = substr($val, 0, -1); + switch ($last) { + case 'g': + $bytes *= 1024; + // fall through + // no break + case 'm': + $bytes *= 1024; + // fall through + // no break + case 'k': + $bytes *= 1024; + break; + } + } else { + $bytes = $val; + } + + if ($bytes >= (1 << 30)) { + return ($bytes >> 30) . 'GB'; + } elseif ($bytes >= (1 << 20)) { + return ($bytes >> 20) . 'MB'; + } elseif ($bytes >= (1 << 10)) { + return ($bytes >> 10) . 'KB'; + } + + return $bytes . 'B'; + } } diff --git a/resources/views/setting/base.blade.php b/resources/views/setting/base.blade.php index 1afa6b3..5ed6441 100644 --- a/resources/views/setting/base.blade.php +++ b/resources/views/setting/base.blade.php @@ -10,6 +10,8 @@ href="{{ route('setting') }}"> プロフィール プライバシー + データのインポート データのエクスポート データのインポート +
+

外部で作成したチェックインデータをTissueに取り込むことができます。

+
+ {{ csrf_field() }} +
+ 取り込むファイルを選択してください。 + {{ Formatter::normalizeIniBytes(ini_get('upload_max_filesize')) }}までのCSVファイル、文字コードは Shift_JIS と UTF-8 (BOMなし) に対応しています。 + + @if ($errors->has('file')) +
{{ $errors->first('file') }}
+ @endif +
+ @if (session('import_errors')) +
+

インポートに失敗しました

+ @foreach (session('import_errors') as $err) +

{{ $err }}

+ @endforeach +
+ @endif + +
+@endsection + +@push('script') +@endpush diff --git a/routes/web.php b/routes/web.php index 7ee08fb..ca1affc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -36,6 +36,8 @@ Route::middleware('auth')->group(function () { Route::post('/setting/profile', 'SettingController@updateProfile')->name('setting.profile.update'); Route::get('/setting/privacy', 'SettingController@privacy')->name('setting.privacy'); Route::post('/setting/privacy', 'SettingController@updatePrivacy')->name('setting.privacy.update'); + Route::get('/setting/import', 'SettingController@import')->name('setting.import'); + Route::post('/setting/import', 'SettingController@storeImport')->name('setting.import'); Route::get('/setting/export', 'SettingController@export')->name('setting.export'); Route::get('/setting/export/csv', 'SettingController@exportToCsv')->name('setting.export.csv'); Route::get('/setting/deactivate', 'SettingController@deactivate')->name('setting.deactivate');