ホームページ バックエンド開発 PHPチュートリアル Fine Uploader ファイルアップロードコンポーネントアプリケーションの紹介_PHP チュートリアル

Fine Uploader ファイルアップロードコンポーネントアプリケーションの紹介_PHP チュートリアル

Jul 21, 2016 pm 03:13 PM
アップロード 導入 バックステージ 対処する 成し遂げる 応用 データ 書類 時間 ほとんど コンポーネント 必要

最近では、バックグラウンドデータを処理する際にファイルのアップロードを実装する必要があるため、Fine Uploader を使用してファイルをアップロードする際に ajax を使用します (環境に応じて)。ブラウザのバージョン] IE のバージョンは 9 以降である必要があります [IE10]。このコンポーネントは、基本的に現在の主流のブラウザに依存しません。サードパーティのコンポーネントは、すでにサーバー側でサポートされており、ファイル サイズ、ファイル タイプの制限などをサポートしています。ファイルのアップロード数などは、公開されたオプションを備えた統一インターフェイスを通じて操作されます。

Github の Fine Uploader を参照 公式声明によると、Fine Uploader の前身は Ajax Upload です。新しいバージョンの Fine Uploader には主にいくつかの新機能が追加されています。バージョン 1.0 でリリースされた Realse Note から判断すると、この 2 つの最大の違いは、Fine Uploder が Jquery コンポーネントに基づいていないことです。同様の戻り値もすべて Json に統一されています。バックグラウンド サーバー操作とフロントエンド Dom オブジェクトの一部の操作コードはすべて Js Script スクリプト ファイルに集中されており、この統合により、CSS + JavaScript ファイルを追加するだけでファイルのアップロードを実現できます。ユーザーによるコンポーネントの参照と操作の難しさを大幅に簡素化します

Fine Uploader の機能は次のとおりです:
Fine Uploader の機能:
A: ファイルのアップロードの進行状況表示をサポートします
B: ファイルのドラッグ アンド ドロップによるブラウザ アップロード方法
C : 更新を行わない Ajax ページ。
F: クロスブラウザー。
E: Git Hub および Php Designer でパッケージ化ソース コードをダウンロードします。 8 のコードを確認すると、ソース コード構造が次のとおりであることがわかります。


ルート ディレクトリには、クライアント呼び出しに必要なファイルが表示されます。サーバー ディレクトリは、Perl/Php/Asp.net のさまざまな言語バージョンに対応しています。 [VB] など。implementation.test ディレクトリには、参考用の完全なローカル サンプル デモが含まれています。実際、公式が Basic-Demo-Page で簡単なデモを提供しています。 Bootstrap メソッドに基づいてここに構築します。 2013-01-04_162943まず、新しい空の Html ページを作成し、次のように CSS 参照を追加します。



コードは次のとおりです。

これら 2 つのファイルをダウンロードするときに参照する必要がある .fineuploader.css は、Fine Uploder のソース コードに対応する Client ディレクトリです。次の .fineuploder.css は、主にボタン スタイル、進行状況表示スタイル、次のように JavaScript ファイル参照を追加します: コードをコピーします
コードは次のとおりです:



;

Uploder.jsとuploader.basic.jsはすべてこのスクリプトに実装されているフロントエンドのアップロード機能です。
同時に処理と読み込みの進行状況の表示に必要な2つの動的画像を追加します。これらの画像は、fineuploder.css ファイルで呼び出されます。

次のコードを本文に追加します



コードをコピーします

コードは次のとおりです。



function createUploader() {
var Uploader = new qq.FineUploader({
element: document.getElementById('bootstrapped-fine-uploader'),
request: {
endpoint: 'server/handlerfunction'
},
text: {
uploadButton: ' 今すぐクリックして商品画像をアップロードしてください'
},
template:
'
' +
'
<span>{dragZoneText}</span>
ログイン後にコピー
' +
'
{uploadButtonText}
' +
'{dropProcessingText}'+
''+
'
    ' +
    '
    ',
    classes: {
    success: 'alertアラート成功'、
    失敗: 'アラート アラートエラー'
    }、
    デバッグ: true
    });
    }

    window.onload = createUploader;
    スクリプト>

    これは、Bootstrap に基づいており、Fine Uploader の最上級のフロントエンド用です。フロントエンド一般に必要なアイテム事 A: 追加 Css+Js 文例参照。B: 在 Js 中实例化 qq.FineUploder オブジェクト.运行効果如下:
    2013-01-04_170433
    查看JS構築qq.Fineuploader对象建过程.最初指定Fine Uploader插件のDom元素.通过Dom获取操作.request对应サービス务器端实现文件路径.在这建议不要自己構築サービス端末処理。むしろ直接採用官方提供の実装文書修正即可。template は、パッケージ上転送ファイルの追加コンテンツ モジュールの自己修正も可能です。debug は、ウェアラブルの制御台を使用するかどうかを制御するために使用される、Fine Uploader の通知情報であり、false と認められます。
    qq.FineUploader オブジェクトには次のような制御制御パラメータがあります:
    検証: このパラメータ一般的に使用される、実行上での文件操作前.在客端視一部验证.验证操作包含文件格式.文件大小.等追加格式如下:
    复制代符号代码如下:

    validation:
    {
    allowedExtensions: ['jpeg', 'jpg', 'gif', 'png'],
    sizeLimit: 204800 // 200 kB = 200 * 10 24バイト
    }
    allowedExtensions 制御上传文件の後缀格式数组。
    sizeLimit 転送ファイルサイズの上限、単位はバイトの数です。デバイスは必ずしもこの配置をサポートしているわけではありません。サーバーの端末に配置することもできます。
    minSizeLimit: 上転送ファイルサイズの下限、単位はバイトの数。同様に、いくつかのバイザーが存在します。
    外部针对qq.FineUploder对オブジェクト执行上で制御可能五个客端制御可能イベント再コールバックパラメータ下設定可能:
    callbacks:
    {
    onSubmit: function(id, fileName) {
    $messages.append('
    ');
    },
    onUpload: function(id, fileName) {
    $('#file-' + id).addClass('alert-info')
    .html('Fine Uploader ファイルアップロードコンポーネントアプリケーションの紹介_PHP チュートリアル ' +
    '初期化中 ' +
    '"' + ファイル名 + '"');
    }
    }

    onSubmit イベント: ファイルの送信が開始されます。呼び出しパラメーターの形式は次のとおりです: onSubmit:function(id, fileName){}。
    onUpload イベント: ファイルのアップロードが開始されます。 : function(id, fileName) {}。
    onProgress イベント: ファイルがアップロードされています。呼び出しパラメーターの形式は次のとおりです: onProgress:function(id,fileName,loaded,total){}。ファイルは次のとおりです。呼び出しパラメータの形式は次のとおりです: onComplete:function(id,fileName,responseJSON){ }。
    onCancel イベント: ファイルのアップロードをキャンセルします。呼び出しパラメータの形式は次のとおりです: onCancel:function(id,fileName){}
    上記の 5 つのイベントは、基本的にファイルのアップロード操作全体のすべてのプロセスをカバーします。これは完全にオープンであり、上記のイベントを呼び出すためのパラメーターの説明は次のとおりです:
    Id: ファイルを示します。 Fine Uploder の定義は、デフォルトで 0 からカウントされます。
    loaded: サーバーにアップロードされたデータのサイズ。 total: アップロードされるファイルのサイズ
    responseJSON: アップロード操作が完了した後に返される Json 形式のデータには、アップロードが成功したかどうかを判断するための IsSuccess 属性が含まれます。アップロード プロセス中にデータをサーバーに転送する場合は、次のパラメーターを使用して制御できます:
    params: データをサーバーに転送するために使用されます。パラメーターは、Post メソッドを使用して送信されることに注意してください。サーバー側に渡す一般的なパラメータの形式は次のとおりです:



    コードをコピーします
    コードは次のとおりです: params: {
    argument1: "value1",
    argument2: "value2"
    },


    OK。基本的に、Fine Uploader クライアントの初期化と制御操作のオプションは、IsAuto=false の場合、uploadStoreFiles() メソッドを通じて手動でトリガーできます。定義されている qq.FineUploader オブジェクト:


    コードをコピー
    コードは次のとおりです: $('#triggerUpload').click(function() { uploader2.uploadStoredFiles();
    } );


    この時点でアップロードをクリックすると、アップロード サーバーでまだ処理が行われていないことがわかります。


    コードをコピーします。
    コードは次のとおりです。 request: { endpoint: 'server/handlerfunction' },

    この時点で、ファイルのアップロードを処理するPhpファイルをEndPointで指定する必要があります[サーバー側については、まだない場合]。成熟した処理モジュールであるため、公式のサーバー ディレクトリを使用することをお勧めします。ここでは php 環境を使用し、対応するクライアントの変更は次のとおりです。



    コードをコピーします。次のように:


    request:
    { endpoint: 'controller/php.php' }
    php.php を開き、ファイルのヘッダーで XMLHttpRequest を処理する 3 つのクラスを定義していることを確認します。 FormPost、および BasicPost ファイルのサーバー側の処理はそれぞれ、ファイルの先頭のコメントで説明されています:
    /*****************************************
    このアップローダークラスの使用方法の例...
    次の行 (require を除く) のコメントを解除して、
    hese をデフォルトとして使用できます。

    // 有効な拡張子のリスト。例: array("jpeg", "xml", "bmp")
    $allowedExtensions = array();
    // バイト単位の最大ファイルサイズ
    $sizeLimit = 10 * 1024 * 1024;
    //JavaScript で設定された入力名
    $inputName = 'qqfile'

    require('valums-file-uploader/server/php.php');
    $uploader = 新しい qqFileUploader($allowedExtensions, $sizeLimit, $inputName);

    // PHP の getcwd() に相対的なフォルダー名を指定して handleUpload() を呼び出します
    $result = $uploader->handleUpload('uploads/');

    // iframe 経由でデータを渡すには、すべての HTML タグをエンコードする必要があります
    header("Content-Type: text/plain");
    echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);

    /*****************************************/
    次のクラス呼び出しメソッドを簡単に追加するだけです。サーバー側の処理を完了します:



    コードをコピーします

    コードは次のとおりです:


    $allowedExtensions = array("jpeg", "jpg", "bmp", "png");
    $sizeLimit = 10 * 1024 * 1024 ; $uploader = new qqFileUploader($allowedExtensions, $sizeLimit); $result = $uploader->handleUpload('uploads/'); //アップロードされたファイルのフォルダー echo htmlspecialchars($result) )、ENT_NOQUOTES) ;
    allowExtensions は、ファイルのアップロードを許可する形式を定義します。
    sizeLimit の上限は、現在の PHP 環境設定を出力するために最初に使用されることに注意してください。 2M. より大きなファイルをアップロードする必要がある場合、php.ini ファイルの設定パラメータの変更についてはここでは説明しません。
    uploder は qq.Fileuploder オブジェクトを初期化し、設定をロードします。サーバー側のストレージ アップロード ファイルのストレージ パス。
    echo はサーバー側の出力のアップロード結果を必要とします。そうでない場合、クライアントはアップロード ステータスを判断するために指定されたレスポンスジェイソン パラメーターを受け入れることができません。サーバーはアップロードを処理し、handleUpload 関数定義を見つけます。



    コードをコピーします。 コードは次のとおりです。
    /*** アップロードされたファイルを処理します * @param string $uploadDirectory
    * @param string $replaceOldFile=true
    * @returns array('success'=>true) または array('error'=>'error message')
    */
    function handleUpload($uploadDirectory, $replaceOldFile = FALSE){
    if (!is_writable($uploadDirectory)){
    return array('error' => "サーバー エラー。アップロード ディレクトリは書き込み可能ではありません。");
    }

    if (!$this->file ){
    return array('error' => 'ファイルはアップロードされませんでした。');

    $size = $this ->file->getSize();

    if ($size == 0) ) {
    return array('error' =>'ファイルが空です');
    }

    if ($size > $ this->sizeLimit) {
    return array('error' => 'ファイルは空です')大きすぎます');
    }

    $pathinfo($this->file->getName());
    $ filename = $pathinfo['filename']
    //$filename = md5( ));
    $ext = @$pathinfo['extension'];// 拡張子が空の場合は通知を非表示にする

    if($this ->allowedExtensions && !in_array(strto lower($ext), $this->allowedExtensions )){
    $these = implode(', ', $this->allowedExtensions);
    return array('error' => ; 'ファイルの拡張子は無効です。'. $these . ' のいずれかである必要があります。 ');
    } $ext = ($ext == '') ? $ext : '.'

    if(!$replaceOldFile){
    ///アップロードされました
    while (file_exists($uploadDirectory . DIRECTORY_SEPARATOR . $filename . $ext)) {
    $filename .= rand(10, 99)
    }
    }

    $this->uploadName = $ext;

    if ($this->file->save($uploadDirectory . DIRECTORY_SEPARATOR . $filename . $ext)){
    return array('success'=>true)
    } else {
    return array(' error'=> 'アップロードされたファイルを保存できませんでした'
    }

    }


    したがって、受信パスは次のようにフォーマットする必要があります。
    $uploadDirectory = $_SERVER['DOCUMENT_ROOT ']."DS".$uploadDirectory; 個人的には、is_writeable ファイルの詳細が十分ではないと思います。 is_writeable は主にファイルまたはディレクトリが存在するかどうかを判断するため、is_writable の前にファイルが存在するかどうかを判断しやすくすることを個人的にお勧めします。サーバー側のファイルエラーの状況:



    コードをコピー

    コードは次のとおりです:


    if (!file_exists($uploadDirectory)) {
    return array(' error' => "サーバーエラー。アップロード ディレクトリが存在しません。");
    }

    ファイル保存操作の前に、処理関数がアップロードされたファイルの数、アップロードされたファイルのサイズ、ファイルのアップロードサイズが上限を超えているかどうか、アップロード処理中にそれぞれ 4 つの判断を行っていることがわかります。サーバー側で同じファイルをアップロードしたい場合、Fine Uploder の処理方法は書き換えではなく、ファイルに 10 から 99 までの乱数を付けて名前を付けてディレクトリに保存することがわかります。ファイルが正常に保存されると、サーバー側はアップロード操作が成功したかどうかを指定する IsSuccess を含む Json データを返します。IsSuccess パラメーターは、アップロード操作中にクライアントが操作を決定するための唯一のパラメーターとして使用されます。実際、この問題に対処するには、アップロード ファイルの設定が PHP 環境のデフォルトの 2M を超えていることが主な原因です。値を変更する必要があります。 php.ini ファイルの post_max_size と Upload_max_filesize を 10M を超えて変更し、Apache を再起動するか、Php 公式 Web サイトで設定手順を参照してください。 php.ini 設定ファイルを変更します。これで、Fine Uploader の設定プロセス全体が完了しました。クリックしてファイルを選択すると、次のような効果が表示されます:


    もちろん、詳細については、上記の Fine Uploader Analyze の公式デモを参照してください。ソースコードの観点から見た原理
    2013-01-04_191128
    http://www.bkjia.com/PHPjc/326398.html

    www.bkjia.com本当http://www.bkjia.com/PHPjc/326398.html技術記事最近では、バックグラウンドデータを処理する際にファイルアップロードを実装する必要があるため、Fine Uploader を使用して、Ajax を使用してファイルを直接アップロードすることができます...
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    オープンソース!ゾーイデプスを超えて! DepthFM: 高速かつ正確な単眼深度推定! オープンソース!ゾーイデプスを超えて! DepthFM: 高速かつ正確な単眼深度推定! Apr 03, 2024 pm 12:04 PM

    0.この記事は何をするのですか?私たちは、多用途かつ高速な最先端の生成単眼深度推定モデルである DepthFM を提案します。従来の深度推定タスクに加えて、DepthFM は深度修復などの下流タスクでも最先端の機能を実証します。 DepthFM は効率的で、いくつかの推論ステップ内で深度マップを合成できます。この作品について一緒に読みましょう〜 1. 論文情報タイトル: DepthFM: FastMonocularDepthEstimationwithFlowMatching 著者: MingGui、JohannesS.Fischer、UlrichPrestel、PingchuanMa、Dmytr

    WIN10サービスホストの動作プロセスがCPUを過剰に占有している WIN10サービスホストの動作プロセスがCPUを過剰に占有している Mar 27, 2024 pm 02:41 PM

    1. まず、タスクバーの空白スペースを右クリックして[タスクマネージャー]オプションを選択するか、スタートロゴを右クリックして[タスクマネージャー]オプションを選択します。 2. 開いたタスク マネージャー インターフェイスで、右端の [サービス] タブをクリックします。 3. 開いた[サービス]タブで、下の[サービスを開く]オプションをクリックします。 4. 表示される[サービス]ウィンドウで、[InternetConnectionSharing(ICS)]サービスを右クリックし、[プロパティ]オプションを選択します。 5. 表示されたプロパティ画面で[プログラムから開く]を[無効]に変更し、[適用]をクリックして[OK]をクリックします。 6. スタートロゴをクリックし、シャットダウンボタンをクリックして[再起動]を選択し、コンピュータの再起動を完了します。

    Google は大喜び: JAX のパフォーマンスが Pytorch や TensorFlow を上回りました! GPU 推論トレーニングの最速の選択肢となる可能性があります Google は大喜び: JAX のパフォーマンスが Pytorch や TensorFlow を上回りました! GPU 推論トレーニングの最速の選択肢となる可能性があります Apr 01, 2024 pm 07:46 PM

    Google が推進する JAX のパフォーマンスは、最近のベンチマーク テストで Pytorch や TensorFlow のパフォーマンスを上回り、7 つの指標で 1 位にランクされました。また、テストは最高の JAX パフォーマンスを備えた TPU では行われませんでした。ただし、開発者の間では、依然として Tensorflow よりも Pytorch の方が人気があります。しかし、将来的には、おそらくより大規模なモデルが JAX プラットフォームに基づいてトレーニングされ、実行されるようになるでしょう。モデル 最近、Keras チームは、ネイティブ PyTorch 実装を使用して 3 つのバックエンド (TensorFlow、JAX、PyTorch) をベンチマークし、TensorFlow を使用して Keras2 をベンチマークしました。まず、主流のセットを選択します

    iPhoneのセルラーデータインターネット速度が遅い:修正 iPhoneのセルラーデータインターネット速度が遅い:修正 May 03, 2024 pm 09:01 PM

    iPhone のモバイル データ接続に遅延や遅い問題が発生していませんか?通常、携帯電話の携帯インターネットの強度は、地域、携帯ネットワークの種類、ローミングの種類などのいくつかの要因によって異なります。より高速で信頼性の高いセルラー インターネット接続を実現するためにできることがいくつかあります。解決策 1 – iPhone を強制的に再起動する 場合によっては、デバイスを強制的に再起動すると、携帯電話接続を含む多くの機能がリセットされるだけです。ステップ 1 – 音量を上げるキーを 1 回押して放します。次に、音量小キーを押して、もう一度放します。ステップ 2 – プロセスの次の部分は、右側のボタンを押し続けることです。 iPhone の再起動が完了するまで待ちます。セルラーデータを有効にし、ネットワーク速度を確認します。もう一度確認してください 修正 2 – データ モードを変更する 5G はより優れたネットワーク速度を提供しますが、信号が弱い場合はより適切に機能します

    iPhoneのホーム画面から削除を元に戻す方法 iPhoneのホーム画面から削除を元に戻す方法 Apr 17, 2024 pm 07:37 PM

    ホーム画面から重要なものを削除してしまい、元に戻そうとしていますか?さまざまな方法でアプリのアイコンを画面に戻すことができます。 iPhoneでホーム画面から削除を元に戻す方法 前述したように、iPhoneでこの変更を復元する方法はいくつかあります。方法 1 – App ライブラリのアプリ アイコンを置き換える App ライブラリから直接ホーム画面にアプリ アイコンを配置できます。ステップ 1 – 横にスワイプして、アプリ ライブラリ内のすべてのアプリを見つけます。ステップ 2 – 前に削除したアプリのアイコンを見つけます。ステップ 3 – アプリのアイコンをメインライブラリからホーム画面上の正しい場所にドラッグするだけです。これが応用図です

    超知性の生命力が覚醒する!しかし、自己更新 AI の登場により、母親はデータのボトルネックを心配する必要がなくなりました。 超知性の生命力が覚醒する!しかし、自己更新 AI の登場により、母親はデータのボトルネックを心配する必要がなくなりました。 Apr 29, 2024 pm 06:55 PM

    世界は狂ったように大きなモデルを構築していますが、インターネット上のデータだけではまったく不十分です。このトレーニング モデルは「ハンガー ゲーム」のようであり、世界中の AI 研究者は、データを貪欲に食べる人たちにどのように餌を与えるかを心配しています。この問題は、マルチモーダル タスクで特に顕著です。何もできなかった当時、中国人民大学学部のスタートアップチームは、独自の新しいモデルを使用して、中国で初めて「モデル生成データフィード自体」を実現しました。さらに、これは理解側と生成側の 2 つの側面からのアプローチであり、両方の側で高品質のマルチモーダルな新しいデータを生成し、モデル自体にデータのフィードバックを提供できます。モデルとは何ですか? Awaker 1.0 は、中関村フォーラムに登場したばかりの大型マルチモーダル モデルです。チームは誰ですか?ソフォンエンジン。人民大学ヒルハウス人工知能大学院の博士課程学生、ガオ・イージャオ氏によって設立されました。

    テスラのロボットは工場で働く、マスク氏:手の自由度は今年22に達する! テスラのロボットは工場で働く、マスク氏:手の自由度は今年22に達する! May 06, 2024 pm 04:13 PM

    テスラのロボット「オプティマス」の最新映像が公開され、すでに工場内で稼働可能となっている。通常の速度では、バッテリー(テスラの4680バッテリー)を次のように分類します:公式は、20倍の速度でどのように見えるかも公開しました - 小さな「ワークステーション」上で、ピッキング、ピッキング、ピッキング:今回は、それがリリースされたハイライトの1つビデオの内容は、オプティマスが工場内でこの作業を完全に自律的に行​​い、プロセス全体を通じて人間の介入なしに完了するというものです。そして、オプティマスの観点から見ると、自動エラー修正に重点を置いて、曲がったバッテリーを拾い上げたり配置したりすることもできます。オプティマスのハンドについては、NVIDIA の科学者ジム ファン氏が高く評価しました。オプティマスのハンドは、世界の 5 本指ロボットの 1 つです。最も器用。その手は触覚だけではありません

    Alibaba 7B マルチモーダル文書理解の大規模モデルが新しい SOTA を獲得 Alibaba 7B マルチモーダル文書理解の大規模モデルが新しい SOTA を獲得 Apr 02, 2024 am 11:31 AM

    マルチモーダル文書理解機能のための新しい SOTA!アリババの mPLUG チームは、最新のオープンソース作品 mPLUG-DocOwl1.5 をリリースしました。これは、高解像度の画像テキスト認識、一般的な文書構造の理解、指示の遵守、外部知識の導入という 4 つの主要な課題に対処するための一連のソリューションを提案しています。さっそく、その効果を見てみましょう。複雑な構造のグラフをワンクリックで認識しMarkdown形式に変換:さまざまなスタイルのグラフが利用可能:より詳細な文字認識や位置決めも簡単に対応:文書理解の詳しい説明も可能:ご存知「文書理解」 「」は現在、大規模な言語モデルの実装にとって重要なシナリオです。市場には文書の読み取りを支援する多くの製品が存在します。その中には、主にテキスト認識に OCR システムを使用し、テキスト処理に LLM と連携する製品もあります。

    See all articles