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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

0回答

1414閲覧

LaravelでCropperを使い画像の切り抜きをし登録したい

mikimiki0055

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/04/27 13:35

前提・実現したいこと

LaravelでCropperを使って、画像の切り抜きをして、登録をする機能を作りたいです。

・ローカルからファイルを選択し画像を選択したら切り抜きするモーダルを表示する。
・モーダルのcropボタンを押すと、切り抜きした画像はpublic/storage/に保存し、モーダルを閉じて切り抜きされた画像が選択されている状態になる。
・その後、登録ボタンでデータベースに保存される。

発生している問題

モーダルのcropボタンを押しても何も反映されなくて困っています。。。(´;ω;`)

該当のソースコード

php

1[image/add.blade.php] 2@extends('layouts.app') 3 4<form class="form-horizontal" action="{{ url('/') }}/image/add" method="post" enctype='multipart/form-data'> 5 @csrf 6  <label for="account" class="col-sm-4 col-form-label text-md-right">nama:</label>  7 <div class="col-md-6"> 8 <input type="text" name="account" size="50" value="{{old('name')}}" ></br> 9 </div> 10 <label for="image" class="col-sm-4 col-form-label text-md-right">image:</label> 11 <div class="col-md-6"> 12 <input type="file" name="image" class="image" value="{{old('image')}}"></br> 13 </div> 14 <input type="submit" value="登録"> 15</form> 16<div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> 17 <div class="modal-dialog modal-lg" role="document"> 18 <div class="modal-content"> 19 <div class="modal-header"> 20 <h5 class="modal-title" id="modalLabel">画像編集</h5> 21 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 22 <span aria-hidden="true">×</span> 23 </button> 24 </div> 25 <div class="modal-body"> 26 <div class="img-container"> 27 <div class="row"> 28 <div class="col-md-8"> 29 <img id="image" src="https://avatars0.githubusercontent.com/u/3456749"> 30 </div> 31 <div class="col-md-4"> 32 <div class="preview"></div> 33 </div> 34 </div> 35 </div> 36 </div> 37 <div class="modal-footer"> 38 <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button> 39 <button id="crop" class="btn btn-primary">Crop</button> 40 </div> 41 </div> 42 </div> 43 </div> 44<script type="text/javascript"> 45 // init 46 // class='cropper-example-1のimgタグに適用' 47 var $image = $('.cropper-example-1 > img'),replaced; 48 49 //crop options 50 // id='imgに適用' 51 $('#img').cropper({ 52 aspectRatio: 4 / 4 // ここでアスペクト比の調整 ワイド画面にしたい場合は 16 / 9 53 54 }); 55 </script>

js

1[image.js] 2 3'use strict'; 4 5var $modal = $('#modal'); 6var image = document.getElementById('image'); 7var cropper; 8$(function(){ 9 10$("body").on('change', '.image', function(e){ 11 var files = e.target.files; 12 var done = function (url) { 13 image.src = url; 14 $modal.modal('show'); 15 }; 16 var reader; 17 var file; 18 var url; 19 20 if (files && files.length > 0) { 21 file = files[0]; 22 23 if (URL) { 24 done(URL.createObjectURL(file)); 25 } else if (FileReader) { 26 var reader = new FileReader(); 27 reader.onload = function (e) { 28 done(reader.result); 29 }; 30 reader.readAsDataURL(file); 31 } 32 } 33}); 34 35$modal.on('shown.bs.modal', function () { 36 cropper = new Cropper(image, { 37 aspectRatio: 1, 38 viewMode: 3, 39 preview: '.preview' 40 }); 41}).on('hidden.bs.modal', function () { 42 cropper.destroy(); 43 cropper = null; 44}); 45$("#crop").on('click',function(){ 46 canvas = cropper.getCroppedCanvas({ 47 width: 160, 48 height: 160, 49 }); 50 }); 51 canvas.toBlob(function(blob) { 52 url = URL.createObjectURL(blob); 53 var reader = new FileReader(); 54 reader.readAsDataURL(blob); 55 reader.onloadend = function() { 56 var base64data = reader.result; 57 58 $.ajax({ 59 type: 'POST', 60 dataType: 'json', 61 url: 'image/upload', 62 data: {'_token': $('meta[name="_token"]').attr('content'), 'image': base64data}, 63 success: function(data){ 64 $modal.hide('slow'); 65 alert("画像を登録しました!"); 66 } 67 }); 68 } 69 }); 70 }); 71

php

1[ImageController] 2 3use Illuminate\Http\Request; 4use Image; 5 6public function add(Request $request){ 7 return view('image.add'); 8 } 9 public function create(Request $request){ 10 $image = new Image; 11 $form = $request->all(); 12 unset($form['_token']); 13 $image->fill($form)->save(); 14 return redirect('/image/add'); 15 16public function upload(Request $request) 17 { 18 $folderPath = public_path('/storage/images/' ); 19 $image_parts = explode(";base64,", $request->image); 20 $image_type_aux = explode("image/", $image_parts[0]); 21 $image_type = $image_type_aux[1]; 22 $image_base64 = base64_decode($image_parts[1]); 23 $file = $folderPath . Auth::id() . '.jpg'; 24 25 file_put_contents($file, $image_base64); 26 return response()->json(['success'=>'success']); 27 }

php

1[web.php] 2 3Route::get('image/add', 'EngilController@add'); 4Route::post('image/add', 'EngilController@create'); 5Route::post('image/upload', 'EngilController@upload'); 6

php

1[layouts/app.blade.php] 2 3<!doctype html> 4<html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> 5<head> 6<meta charset="utf-8"> 7<meta name="viewport" content="width=device-width, initial-scale=1"> 8 9<!-- CSRF Token --> 10<meta name="csrf-token" content="{{ csrf_token() }}"> 11<title>{{ config('app.name', 'Laravel') }}</title> 12 13<!-- Scripts --> 14<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script> 15<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 16<script src="https://cdnjs.cloudflare.com/ajax/libs/cropper/1.0.0/cropper.min.js"></script> 17<script src="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.6/cropper.js" integrity="sha256-CgvH7sz3tHhkiVKh05kSUgG97YtzYNnWt6OXcmYzqHY=" crossorigin="anonymous"></script> 18<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha256-WqU1JavFxSAMcLP2WIOI+GB2zWmShMI82mTpLDcqFUg=" crossorigin="anonymous"></script> 19<script src="/image.js"></script> 20 21<!-- Styles --> 22<link href="{{ asset('css/app.css') }}" rel="stylesheet"> 23<link href="https://cdnjs.cloudflare.com/ajax/libs/cropper/1.0.0/cropper.min.css" rel="stylesheet" type="text/css" media="all"/> 24<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.4.1/css/bootstrap.min.css" crossorigin="anonymous" /> 25<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.6/cropper.css" integrity="sha256-jKV9n9bkk/CTP8zbtEtnKaKf+ehRovOYeKoyfthwbC8=" crossorigin="anonymous" /> 26

補足情報

cropボタン以外は正常に動いてます。
cropボタンを押すとモーダルは閉じてimage/addのviewに戻りますが切り抜きしたimageが消えて無くなってしまいます。(データベースにも public_path('/storage/images/')にも保存されません。
cropボタンを反映させるには、どうしたら良いでしょうか。。

JavaScipt&jQuery初心者です。laravelもまだ半年です。。
記述の仕方など、めちゃくちゃで読みづらいかもしれません。。

ご助言いただけますと嬉しいです(´;ω;`)

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

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

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

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

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

hayato7

2020/04/27 14:40

ボタンを押下した時、consoleにもなんのエラーも出ていないのでしょうか?
mikimiki0055

2020/04/27 14:51

コメントいただきましてありがとうございます! エラーは何も出ていないのです。。。ただ、モーダルが閉じて、何事もなかったようになります。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問