1

まず、英語は私の母国語ではないので、間違いをお許しください。

Symfony2 を使用して最初のプロジェクトを開発しようとしています。ただし、ファイルのアップロードで行き詰まりました。そのため、管理する必要があるものを正確に提供する VichUploaderBundle をインストールしました: アップロードされたすべての種類のメディア (主に画像)。

なぜ画像をアップロードする必要があるのですか? プロジェクトにユーザーがいて、プロファイルを編集できます。そのため、VichUploaderBundle のおかげで、アップロードを管理する必要があるエンティティ ProfilePicture があります。送信ボタンまたはajaxを使用してフォームを送信すると、完全に機能します。

ただし、ユーザー エクスペリエンスを向上させるために、jQuery プラグイン (Cropit) も追加しました。Cropit は、トリミングされた画像の base64 を返します。全体をajaxで送っています。

そして知っている...私は苦労しています。私はアイデアの始まりを持っている人を見つけるためにインターネット上のあらゆる場所を検索してきました。すべてのドキュメントを読み、自分がやろうとしていることを行う別の方法を見つけようとしました.

これが私の実際の「テスト」コードです。

$base64 = $request->request->get('base64');
preg_match('/data:([^;]*);base64,(.*)/', $base64, $matches);
$data = base64_decode($matches[2]);
$ui = uniqid().'.png';
$file = 'images/profile_pictures/'. $ui;
file_put_contents($file, $data);

$picture = new File($file);

$profile->getPicture()->setImageFile($picture);

これにより、トリミングした画像を必要なディレクトリに保存できます。しかし、それは私が本当に望んでいることではありません。実際、base64 コンテンツを、画像を送信した場合に $profile->getPicture()->setImageFile() に存在するものに変換する方法を見つけようとしています。曖昧ですみません。アップロード システムを作成するのは初めてです。

base64 の送信を回避する方法があるのではないかと考えました。しかし、この種のデータで何ができるのでしょうか? jQuery を使用してデコードし、フォームを変換して、画像を選択してその全体を保存したい場合と同じようにフォームを送信することはできますか?

プロジェクトでそれをどのように管理しますか? これより良いバンドルは他にありますか?私は探していましたが、成功しませんでした。SonataMediaBundle は私のニーズには大きすぎるようで、トリミングした画像を保存する方法も見つかりませんでした。

VichUploaderBundle の Git で管理したい人を見つけました。ただし、より良い回答が得られる前に、彼の問題は解決されました... https://github.com/dustin10/VichUploaderBundle/issues/223

助けてくれてありがとう!

4

2 に答える 2

2

バンドルの範囲に収まらないため、問題はクローズされました。VichUploaderBundle は、基本的にUploadedFileフォームを介してオブジェクトをエンティティにマップします。それだけです。

問題のキーワードは「」UploadedFile"と「フォーム」です。

ファイルを base64 でエンコードされた文字列、生のバイトなどとして送信する必要がある場合は、UploadedFileVichUploaderBundle で機能させるためにファイルを に変換する必要があります。私はDataTransformerがそのトリックを行うことができると思います。base64 でエンコードされた文字列をデコードし、それを一時ファイルに保存して、UploadedFile オブジェクトの作成に使用できます。

于 2015-07-18T23:31:37.280 に答える
1

私の現在の解決策を共有したいと思います。

base64 でエンコードされた画像をアップロードする必要があります。これらの画像はcropper.jslib を使用して生成され、特定のエンドポイントに投稿されます。

K-Phoenが提案したようなオブジェクトDataTransformerInterfaceを構築するためにaを使用しました。UploadedFile

バンドルの正規の使用法との違いをいくつか指摘したいと思います。

TextTypeの代わりに使用しますVichFileType(それ以外の場合、検証は失敗します)。データトランスフォーマーを使用して画像をデコードし、一時的に保存します(ヒントK-Phoenに感謝します)。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('file', TextType::class, ['required' => true]);
    $builder->get('file')->addModelTransformer(new FileToBase64Transformer());
}

私のFileToBase64Trasformer

class FileToBase64Transformer implements DataTransformerInterface
{
    public function transform($value)
    {
    }

    public function reverseTransform($value)
    {
        $tmpFilePath = tempnam(sys_get_temp_dir(), 'allegato_');

        $tmp = fopen($tmpFilePath, 'wb+');

        $matches = [];
        preg_match('/^data:([\w-]+\/[\w-]+);base64,(.+)$/', $value, $matches);

        $size = fwrite($tmp, base64_decode($matches[2]));

        fclose($tmp);

        return new UploadedFile($tmpFilePath, 'originalName', $matches[1], $size, 0, true);
    }
}

UploadedFileのコンストラクターのパラメーターに注意してください。

  1. 3 番目のパラメーターは、ファイルの MIME タイプです。
  2. 4番目のパラメーターはエラーコードです(0エラーがまったくないことを意味します)
  3. 5 番目のパラメーターはトリックを行います。内部的に関数UploadedFileを呼び出しis_uploaded_fileますが、失敗します (ファイルはアップロードではなく、base64 文字列をデコードすることによって作成されます) 不明なエラーが発生します。リスクを理解して受け入れる場合は、このパラメーターを に設定しtrueて回避します。
于 2018-02-15T23:04:34.413 に答える