まず、私が達成しようとしていることを簡単に説明させてください。
ユーザーがフォームに記入し、送信時に jQuerys $.post メソッドを使用してすべてのデータを送信し、Laravel 5.1 と Intervention API( http://image.intervention.io/ ) を使用してデータを処理したい画像をサーバー上の正しいディレクトリにアップロードします。
私のデータはサーバー(ローカル)に送信され、Laravels Input クラスを使用してすべてを読み取ることができます。問題は介入の使用方法にあると思いますが、確信が持てません。
これがフォームに関連するJSです(無関係なコードを削除しました):
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
var State = {
CurrentCategorySelected: 1
}
var URIROOT = '/administrator/';
$(document).on('click', '.ModalSave', function(e)
{
var fd = new FormData( $('.ProductForm').get(0) ),
action = $(this).attr('data-saving');
fd.append('category_id', State.CurrentCategorySelected);
$.ajax({
url: URIROOT+"new_product",
type: "POST",
data: fd,
processData: false,
contentType: false,
success: function(response) {
console.log(response);
},
error: function(jqXHR, textStatus, errorMessage) {
console.log(errorMessage);
}
});
e.preventDefault();
});
このJSは問題なく動作しているようですが、データの出所がわかるように投稿すると思いました。
次に、私の Laravel ルートは次のとおりです。
Route::post('new_product', 'Admin\ProductManagerController@saveNewProduct');
また、コントローラー内の関連する PHP は次のとおりです (無関係なコードを削除しました)。
<?php namespace TottonTimber\Http\Controllers\Admin;
use View;
use Image;
use Input;
use DB;
use Illuminate\Http\Request;
use TottonTimber\Http\Requests;
use TottonTimber\Http\Controllers\Controller;
use TottonTimber\Category;
use TottonTimber\Product;
class ProductManagerController extends Controller {
public function saveNewProduct()
{
/*
* Define Varibles
*/
$input = Input::all();
$image = Input::file('main_image');
$image_name = time().$image->getClientOriginalName();
$imageDir = public_path('img/catalogue/products/' . $image_name);
$imageDirSmall = public_path('img/catalogue/products/small_thumbs/' . $image_name);
$imageDirMedium = public_path('img/catalogue/products/medium_thumbs/' . $image_name);
$imageDirLarge = public_path('img/catalogue/products/large_thumbs/' . $image_name);
/*
* Save the Image and all of its resized siblings
*/
Image::make($image->getRealPath())->save($imageDir);
Image::make($image->getRealPath())->resize(null, 100, function ($constraint) {
$constraint->aspectRatio();
})->save($imageDirSmall);
Image::make($image->getRealPath())->resize(null, 200, function ($constraint) {
$constraint->aspectRatio();
})->save($imageDirMedium);
Image::make($image->getRealPath())->resize(null, 400, function ($constraint) {
$constraint->aspectRatio();
})->save($imageDirLarge);
/*
* Create a new entry in the database for the new product
*/
$product = new Product;
$product->description = $input['description'];
$product->content = $input['content'];
$product->price = $input['price'];
$product->product_code = $input['code'];
$product->main_image = $image_name;
$product->status = 'enabled';
$product->save();
/*
* Create the Relationship to its category
*/
DB::table('category_product')->insert([
'category_id' => $input['category_id'],
'product_id' => $product->id
]);
}
}
最初の「Image::make ..」関数が実行される場所でコードが壊れるので、これが間違ったデータを渡しているためなのか、それとも何なのかわかりません。
出力を確認できるように、いくつかのものを var_dump すると、次のようになります。
$image
object(Symfony\Component\HttpFoundation\File\UploadedFile)#27 (7) {
["test":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
bool(false)
["originalName":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
string(23) "22mm Sawn Whitewood.jpg"
["mimeType":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
string(24) "application/octet-stream"
["size":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
int(0)
["error":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
int(1)
["pathName":"SplFileInfo":private]=>
string(0) ""
["fileName":"SplFileInfo":private]=>
string(0) ""
}
$image->getRealPath()
string(52) "C:\Users\alex\Documents\websites\TottonTimber\public"
$imageDir
string(109) "C:\Users\alex\Documents\websites\TottonTimber\public/img/catalogue/products/143869677322mm Sawn Whitewood.jpg"
私が間違っているのは何ですか?