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

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

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

EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

Q&A

解決済

1回答

4856閲覧

ECCUBE3で商品画像をアップすると自動で変数にされてしまう

oyashiro

総合スコア37

EC-CUBE

EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

0グッド

0クリップ

投稿2017/05/27 01:50

編集2017/06/01 04:43

表題について、画像のURLをそのままアップしたいです。
ProductController.phpで
下記のように、変数に変換しているのですが、
どうすれば画像のファイル名のままファイル名が決定されますか?

public function edit(Application $app, Request $request, $id = null) { ~ 省略 ~ // ファイルの登録 $images = array(); $ProductImages = $Product->getProductImage(); foreach ($ProductImages as $ProductImage) { $images[] = $ProductImage->getFileName(); } $form['images']->setData($images); $categories = array(); $ProductCategories = $Product->getProductCategories(); foreach ($ProductCategories as $ProductCategory) { /* @var $ProductCategory \Eccube\Entity\ProductCategory */ $categories[] = $ProductCategory->getCategory(); } $form['Category']->setData($categories); $Tags = array(); $ProductTags = $Product->getProductTag(); foreach ($ProductTags as $ProductTag) { $Tags[] = $ProductTag->getTag(); } $form['Tag']->setData($Tags); if ('POST' === $request->getMethod()) { $form->handleRequest($request); if ($form->isValid()) { log_info('商品登録開始', array($id)); $Product = $form->getData(); if (!$has_class) { $ProductClass = $form['class']->getData(); // 個別消費税 $BaseInfo = $app['eccube.repository.base_info']->get(); if ($BaseInfo->getOptionProductTaxRule() == Constant::ENABLED) { if ($ProductClass->getTaxRate() !== null) { if ($ProductClass->getTaxRule()) { if ($ProductClass->getTaxRule()->getDelFlg() == Constant::ENABLED) { $ProductClass->getTaxRule()->setDelFlg(Constant::DISABLED); } $ProductClass->getTaxRule()->setTaxRate($ProductClass->getTaxRate()); } else { $taxrule = $app['eccube.repository.tax_rule']->newTaxRule(); $taxrule->setTaxRate($ProductClass->getTaxRate()); $taxrule->setApplyDate(new \DateTime()); $taxrule->setProduct($Product); $taxrule->setProductClass($ProductClass); $ProductClass->setTaxRule($taxrule); } } else { if ($ProductClass->getTaxRule()) { $ProductClass->getTaxRule()->setDelFlg(Constant::ENABLED); } } } $app['orm.em']->persist($ProductClass); // 在庫情報を作成 if (!$ProductClass->getStockUnlimited()) { $ProductStock->setStock($ProductClass->getStock()); } else { // 在庫無制限時はnullを設定 $ProductStock->setStock(null); } $app['orm.em']->persist($ProductStock); } ~ 省略 ~ // 画像の登録 $add_images = $form->get('add_images')->getData(); foreach ($add_images as $add_image) { $ProductImage = new \Eccube\Entity\ProductImage(); $ProductImage ->setFileName($add_image) ->setProduct($Product) ->setRank(1); $Product->addProductImage($ProductImage); $app['orm.em']->persist($ProductImage); // 移動 $file = new File($app['config']['image_temp_realdir'] . '/' . $add_image); $file->move($app['config']['image_save_realdir']); } // 画像の削除 $delete_images = $form->get('delete_images')->getData(); foreach ($delete_images as $delete_image) { $ProductImage = $app['eccube.repository.product_image'] ->findOneBy(array('file_name' => $delete_image)); // 追加してすぐに削除した画像は、Entityに追加されない if ($ProductImage instanceof \Eccube\Entity\ProductImage) { $Product->removeProductImage($ProductImage); $app['orm.em']->remove($ProductImage); } $app['orm.em']->persist($Product); // 削除 $fs = new Filesystem(); $fs->remove($app['config']['image_save_realdir'] . '/' . $delete_image); } $app['orm.em']->persist($Product); $app['orm.em']->flush(); $ranks = $request->get('rank_images'); if ($ranks) { foreach ($ranks as $rank) { list($filename, $rank_val) = explode('//', $rank); $ProductImage = $app['eccube.repository.product_image'] ->findOneBy(array( 'file_name' => $filename, 'Product' => $Product, )); $ProductImage->setRank($rank_val); $app['orm.em']->persist($ProductImage); } } $app['orm.em']->flush(); // 商品タグの登録 // 商品タグを一度クリア $ProductTags = $Product->getProductTag(); foreach ($ProductTags as $ProductTag) { $Product->removeProductTag($ProductTag); $app['orm.em']->remove($ProductTag); } // 商品タグの登録 $Tags = $form->get('Tag')->getData(); foreach ($Tags as $Tag) { $ProductTag = new ProductTag(); $ProductTag ->setProduct($Product) ->setTag($Tag); $Product->addProductTag($ProductTag); $app['orm.em']->persist($ProductTag); } $app['orm.em']->flush(); log_info('商品登録完了', array($id)); $event = new EventArgs( array( 'form' => $form, 'Product' => $Product, ), $request ); $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE, $event); $app->addSuccess('admin.register.complete', 'admin'); return $app->redirect($app->url('admin_product_product_edit', array('id' => $Product->getId()))); } else { log_info('商品登録チェックエラー', array($id)); $app->addError('admin.register.failed', 'admin'); } } // 検索結果の保持 $builder = $app['form.factory'] ->createBuilder('admin_search_product'); $event = new EventArgs( array( 'builder' => $builder, 'Product' => $Product, ), $request ); $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_PRODUCT_EDIT_SEARCH, $event); $searchForm = $builder->getForm(); if ('POST' === $request->getMethod()) { $searchForm->handleRequest($request); } return $app->render('Product/product.twig', array( 'Product' => $Product, 'form' => $form->createView(), 'searchForm' => $searchForm->createView(), 'has_class' => $has_class, 'id' => $id, )); }

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

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

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

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

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

xenbeat

2017/05/30 06:05 編集

画像の「URL」というのがしっくりこないのですが、「URL」ではなく、例えばteratail.jpgという「ファイル名」の画像をアップロードしたら、teratail.jpgというそのままの「ファイル名」でサーバーに保存したいということで良いでしょうか?
oyashiro

2017/05/30 09:22

そうです。ご指摘いただいたところは修正致しました。
guest

回答1

0

ベストアンサー

アップロードした画像のファイル名でそのままサーバーに保存したいということでしたら以下を修正することで可能です。

PHP

1$filename = date('mdHis') . uniqid('_') . '.' . $extension; 2 34/** @var Symfony\Component\HttpFoundation\File\UploadedFile $image */ 5$filename = $image->getClientOriginalName();

ただし、該当の処理を見る限り、ファイル名に対するバリデーションを行っていないようですので、上記変更を行うと、どのようなファイル名でも受け入れてしまうことになります。

ご自身だけが利用するのであれば、あまり影響はないかもしれないですが、第三者も利用するのであれば、ファイル名に対するバリデーション(桁数など)を追加することをオススメ致します。

例えば、ファイル名の桁数が、ファイル名を格納するDBのテーブルカラムの桁数を超えるなど、予期せぬエラーが発生することになります。

投稿2017/05/30 12:27

編集2017/06/01 04:59
xenbeat

総合スコア4258

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

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

oyashiro

2017/05/31 07:30

chikumin様回答ありがとうございます。 上記内容では解決しませんでした。もう一つ関係あるjsがあったのでそちらを本文に追加致しました。
xenbeat

2017/05/31 11:57

どう解決しなかったのか教えていただけないでしょうか? あと本文に追加されたというJSが確認できません。
oyashiro

2017/05/31 12:20

申し訳ないです。追記途中でブラウザを閉じていたようです。先ほど追加いたしました。 解決しなかったというか何も変化がありませんでした。
xenbeat

2017/06/01 04:59 編集

ファイル名生成部分思いっきり変更しているので、何も変化がなかったというのは納得出来ないですね。 非同期で一時ディレクトリ($app['config']['image_temp_realdir'])に格納しているようですが、まずは、サブミットする前(アップロード直後)に一時ディレクトリに格納されたファイルの名前を確認してみてください。
oyashiro

2017/06/01 02:10

アップロード直後はやはり変数のままになっておりました。 ちなみに、public function addImage(Application $app, Request $request)の中の処理を修正していたのですが、そのソースごと削除しても正常に動いておりましたのでjsでアップロード全般を行っているのでしょうかね。
xenbeat

2017/06/01 04:38 編集

>ソースごと削除しても正常に動いておりました この状況がそもそもおかしいです。 修正しているソースファイルと、実際にサーバーで動いているソースファイルが一致しているか確認してください。原因はそこです。 >jsでアップロード全般を行っているのでしょうかね。 もちろんブラウザ側でアップロード処理をしているのはJSですよ。 サーバーの一時ディレクトリに画像保存する処理は JSの「url: "{{ url('admin_product_image_add') }}"」の部分を見ての通り、非同期でリクエストを受け取ったサーバーサイド(PHP)で行われます。 DBへのファイルパス保存や正式なディレクトリへの画像保存処理はサブミット時にリクエストを受け取ったサーバーサイド(PHP)で行われると思います。
oyashiro

2017/06/01 04:44

仰るとおり、実行箇所が誤っておりました。正しい実行ソースを本文へ修正致しました。
xenbeat

2017/06/06 14:31 編集

>正しい実行ソース これは前述したとおり、サブミット時の処理です。 その前段階として、質問当初のソースで一時ディレクトリに非同期でアップロードされているはずです。 なので、切り分けとして、まずは、質問当初のソースを変更した結果、一時ディレクトリにアップロードされたファイル名を確認してくださいと言っています。 しかしながら >そのソースごと削除しても正常に動いておりました とおっしゃったように「サブミットの前段階で行っている処理(質問当初のソース)」を削除してもアップロードできるということが考えられないので、修正しているソースファイルをよく確認してくださいと言っています。
xenbeat

2017/06/06 14:29

ちなみに >そのソースごと削除しても正常に動いておりました のソース内の次の処理も削除してみたらどうなりますか? public function edit(Application $app, Request $request, $id = null)
oyashiro

2017/06/07 04:17

public function edit(Application $app, Request $request, $id = null)を削除したところ、システムエラーになりました。
oyashiro

2017/06/07 04:18

>>一時ディレクトリにアップロードされたファイル名を確認 どういうふうに確認すればよいのでしょうか? printか何かでですか?
oyashiro

2017/06/07 04:26

すいません。何かこちらの方でのキャッシュかなにかわかりませんが、ベストアンサーにした記述にして再度テストしたら出来ました。 最後までお付き合いいただきありがとうございました。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問