Last modified date : 2019/01/31

MTAppMultiFileUpload input type

MTAppMultiFileUpload widget type

Data API v1 を利用したファイルアップロード機能を提供します。

ブラウザが <input type="file" multiple> に対応していれば、複数ファイルをまとめてアップロードすることができます。

テキスト入力欄をファイルアップロードに変更する方法と、サイドバーウィジェットにファイルアップローダーを設置する方法があります。

さらに、記事編集画面でアップロードしたファイルは、その記事の記事アイテムに登録されます。

使い方

Data API proxy と組み合わせてる(2017-07-21 追記)

MTAppjQuery と Data API proxy を組み合わせると、MTAppMultiFileUpload も含めて、管理画面で Data API をより快適にお使いいただけます。その方法を下記の記事に掲載していますのでご参照ください。

MTAppjQuery と Data API proxy を組み合わせて管理画面で Data API を快適に使う | かたつむりくんのWWW

Data API SDK の読み込み

この MTAppMultiFileUpload は、Movable Type 6.0 より実装された Data API v1 を利用します。

そのため、 .MTAppMultiFileUpload() を実行するコードよりも手前で、Data API オブジェクトを作成する必要があります。

Data API オブジェクトを作成するには、mt-data-api.js を管理画面に読み込ませる必要がありますので、MTAppjQuery のプラグイン設定の「変数 js_include に追加(の直前)」欄に下記のコードを記述します。

<script type="text/javascript" src="<mt:StaticWebPath>data-api/v1/js/mt-data-api.min.js"></script>

これはウェブサイトやブログのプラグイン設定よりも、システムプラグイン設定の「システム設定」ブロックにある「変数 js_include に追加(の直前)」に書いておくと大変便利です。

Data API オブジェクトの作成

Data API オブジェクトは下記のコードで作成できます。この場合の Data API オブジェクトが格納された変数名は api となります。

var api = new MT.DataAPI({
    baseUrl:  '<mt:CGIPath><mt:Var name="config.DataAPIScript">',
    clientId: 'MTAppMultiFileUpload'
});

clientId は任意の英数文字に変更してください。

このコードは、mt-data-api.js を読み込んだ後で、かつ .MTAppMultiFileUpload() を実行するコードの手前の位置に置き、user.js に記述するか、MTAppjQuery プラグイン設定の「変数 js_include に追加(の直前)」などに記述します。

ただし、プラグイン設定に記述する場合は、全体を <script></script> で囲む必要があります。

Data API の認証処理

Data API を利用してファイルをアップロードするためには、Data API の認証を通す必要があります。

そのため、この MTAppMultiFileUpload を適用した管理画面にアクセスすると一度 Data API でのログイン画面にリダイレクトされます。

このように通常の Movable Type の認証の他に Data API の認証も出てしまうのを回避する方法として、ファイルアップロード権限のみを持たせたユーザーを作っておき、ファイルのアップロード時にバックグラウンドでそのユーザーとしてログインしてアップロードさせる方法があります。

ただし、この方法だと、ファイルをアップロードしたユーザーが投稿者とは別になってしまう可能性もありますのでご注意ください。

バックグラウンドでログインさせるには mtappVars オブジェクトに以下の2つのプロパティを追加します。これは、上記の Data API オブジェクトを作成した直後に記述すると良いでしょう。

mtappVars.DataAPIFileUploadUser = 'ファイルアップロード用ユーザーID';
mtappVars.DataAPIFileUploadUserPassword = 'ファイルアップロード用ユーザーパスワード';

これでバックグラウンドで認証を通ることができます。

ただし、このユーザー情報は user.js などスタティックに書き出すファイルには書かないことを推奨します。また、権限によって管理画面に表示されるなども必要かもしれません。

セキュリティとユーザビリティとを比較検討して、認証を通過する方法を検討してください。

MTAppMultiFileUpload の実行

上記の準備の後、下記のようにメソッドを実行します。

$(foo).MTAppMultiFileUpload(options);

foo には MTAppMultiFileUpload を適用させたい1行テキスト入力欄のセレクタを設定し、options には後述のオプションを設定します。

サンプル

例えば、キーワード欄にファイルアップロード機能を付け、キーワード欄自体にはアップロードしたアイテムの ID を保存する場合は、下記のコードを user.js に記述します。

$('#keywords').MTAppMultiFileUpload({
    api: api,
    type: 'input',
    multiple: true,
    uploadPath: 'upload',
    uploadImagesPath: 'upload/images',
    uploadFilesPath: 'upload/files',
    uploadButton: '<input type="button" value="select files" class="button">'
});

オプション

$(foo).MTAppMultiFileUpload({
    "api": null,
    "siteId": mtappVars.blog_id,
    "normalizeOrientation": true,
    "autoRenameIfExists": true,
    "type": "input",
    "targetInputStyle": {
        display: 'inline',
        marginRight: '1em',
        width: '20em'
    },
    "multiple": true,
    "saveData": "",
    "uploadPath": "upload",
    "uploadImagesPath": null,
    "uploadFilesPath": null,
    "uploadButton": null,
    "cbAfterUpload": null
});

api 必須

Type : Data API Object, Default : null

Data API オブジェクト(を参照する変数名)を指定します。

siteId

Type : Number, Default : mtappVars.blog_id

ファイルをアップロードするブログの ID を指定します。初期値は、現在表示されている管理画面のウェブサイト/ブログの ID となります。

normalizeOrientation

Type : Boolean, Default : true

true を設定すると、アップロードされたファイルの Exif に orientation 属性があれば自動的に調整されます。
初期値は true です。

autoRenameIfExists

Type : Boolean, Default : true

true を設定すると、アップロード先のディレクトリに同名のファイルがあれば自動でリネームされます。

type

Type : String, Default : "input"

1行テキスト入力欄に MTAppMultiFileUpload を適用する場合は input を、サイドバーウィジェットとしてファイルアップローダーを挿入する場合は widget を指定します。

targetInputStyle

Type : Plane Object, Default : { display: 'inline', marginRight: '1em', width: '20em' }

type: "input" として1行テキスト入力欄に MTAppMultiFileUpload を適用した場合、その入力欄に設定する CSS プロパティを指定します。

ここで設定したオブジェクトが jQuery の .css() に渡されます。

multiple

Type : Boolean, Default : true

true を設定すると、ファイル選択ボタンに multiple 属性を追加します。

マルチファイルアップローダーとして利用したい場合は true を、1ファイルのアップローダーとして利用したい場合は false を指定します。

saveData

Type : String, Default :

type: "input" として1行テキスト入力欄に MTAppMultiFileUpload を適用した場合、その入力欄に保存する値をアップロードしたアイテムの ID とする場合は id を、URL とする場合は url を指定します。

uploadPath

Type : String, Default : "upload"

ファイルをアップロード先ディレクトリを指定します。

ファイルをアップロードするウェブサイト/ブログのルートディレクトリからの相対パスになります。

uploadImagesPath

Type : String, Default : null

画像ファイルをアップロードしたときに uploadPath オプションで指定したディレクトリとは別のディレクトリを保存する場合に設定します。

例えば、 uploadImagesPath: "upload/images" のように設定します。

uploadFilesPath

Type : String, Default : null

画像ファイル以外をアップロードしたときに uploadPath オプションで指定したディレクトリとは別のディレクトリを保存する場合に設定します。

例えば、 uploadFilesPath: "upload/files" のように設定します。

uploadButton

Type : String, Default : null

ブラウザ標準のファイル選択ボタン( <input type="file"> )をオリジナルボタンに変更したい場合、変更後のボタンの HTML を設定します。

このボタンをクリックすると、非表示にされている <input type="file"> のクリックイベントが発生します。

cbAfterUpload

Type : Function, Default : null

ファイルをアップロードしたあとに実行される関数を設定します。
このオプションに設定した関数には下記の3つの引数が渡されます。

cbAfterUpload: function(cb, $this, response){
    // do something
}
  • cb : {name: 'cbAfterUpload'}
  • $this : MTAppMultiFileUpload を適用した1行テキスト入力欄の jQuery オブジェクト
  • response : アップロード結果(アイテムの ID や URL など)を格納したオブジェクト