CKEditorでWord画像の貼り付け機能を実装する方法

CKEditorへのWord画像貼り付け機能の実装ガイド

WebアプリケーションでWYSIWYGエディタを使用する場合、ユーザーがWord文書から直接画像を貼り付けできる機能は非常に便利です。この機能により、ユーザーは画像を別途アップロードする手間を省くことができます。

実装のアーキテクチャ

Word画像貼り付け機能の基本的な動作フローは以下の通りです:

  1. ユーザーがCtrl+Vで画像を貼り付け
  2. ブラウザがクリップボードから画像データを取得
  3. 画像データをBase64形式で抽出
  4. サーバーへ画像ファイルをアップロード
  5. サーバーから画像URLを受け取る
  6. エディタ内に画像を挿入

必要なコンポーネント

クライアントサイド

貼り付け処理を制御するJavaScriptライブラリが必要です。以下の設定で初期化します:


// WordPasterの初期化例
WordPaster.getInstance({
    PostUrl: '/api/upload',           // アップロードAPIエンドポイント
    ImageUrl: '',                      // 画像URLのプレフィックス
    FileFieldName: 'file',             // フォームフィールド名
    ImageMatch: '',                    // JSONレスポンスのパターンマッチ
    Cookie: ''                         // セッションCookie(必要な場合)
});

サーバーサイド

画像アップロードを受け付けるAPIが必要です。どのような言語でもHTTP FORMプロトコル対応のインターフェースであれば動作します。

// ASP.NET Coreの例
[HttpPost("upload")]
public async Task<JsonResult> Upload(IFormFile file)
{
    var uploadPath = Path.Combine(_env.WebRootPath, "uploads");
    var fileName = Guid.NewGuid().ToString() + Path.GetExtension(file.FileName);
    var filePath = Path.Combine(uploadPath, fileName);
    
    using (var stream = new FileStream(filePath, FileMode.Create))
    {
        await file.CopyToAsync(stream);
    }
    
    return Json(new { url = $"/uploads/{fileName}" });
}
// PHPの例
<?php
$targetDir = "uploads/";
$fileName = uniqid() . "_" . basename($_FILES["file"]["name"]);
$targetPath = $targetDir . $fileName;

if (move_uploaded_file($_FILES["file"]["tmp_name"], $targetPath)) {
    echo json_encode(["url" => "/uploads/" . $fileName]);
}
?>
// Java Spring Bootの例
@PostMapping("/upload")
public Map<String, String> upload(@RequestParam("file") MultipartFile file) {
    String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename();
    Path path = Paths.get("uploads/" + fileName);
    Files.write(path, file.getBytes());
    
    Map<String, String> result = new HashMap<>();
    result.put("url", "/uploads/" + fileName);
    return result;
}

対応エディタ

この機能は以下のエディタに対応しています:

  • CKEditor(4.x, 5.x)
  • FCKEditor
  • UEditor
  • KindEditor
  • TinyMCE
  • wangEditor
  • xhEditor

対応プラットフォーム

クライアント側は以下のOSで動作します:

  • Windows
  • macOS
  • Linux
  • 信創国産化OS(中标麒麟、銀河麒麟、統信UOS、龙芯など)

設定のポイント

ファイルフィールド名の設定

サーバー側の受取フィールド名が異なる場合、FileFieldNameパラメータで指定します:

WordPaster.getInstance({
    FileFieldName: "upfile"  // デフォルトは"file"
});

レスポンスJSONのパース

サーバーから返されるJSON形式が異なる場合、ImageMatchで正規表現を設定します:

WordPaster.getInstance({
    ImageMatch: /url["\s:]+["\s]([^"]+)/
});

画像URLのプレフィックス設定

相対パスで保存される場合、ドメイン名を追加する必要があります:

WordPaster.getInstance({
    ImageUrl: "https://example.com"
});

セッション認証のあるAPIの場合

認証が必要なアップロードエンドポイントの場合、Cookieを設定します:

WordPaster.getInstance({
    Cookie: 'SESSIONID=abc123'
});

追加機能

基本的な画像貼り付け機能に加えて、以下の機能が必要な場合があります:

  • Word文書の直接インポート(.doc, .docx)
  • Excel文書のインポート(.xls, .xlsx)
  • PDF文書のインポート
  • PowerPoint文書のインポート
  • Web画像(URL指定)のアップロード
  • 微信公众号(WeChat公众号)コンテンツのインポート

トラブルシューティング

画像がアップロードできない

主な原因として考えられること:

  • アップロードページにアクセス制限がある場合(ログイン必須、SESSIONが必要)
  • サーバー側のファイルサイズ制限
  • 許可されていないファイル形式
  • CSRFトークンの缺失

対策:アップロードAPIに適切な認証情報を含めるか、アクセス制限を一時的に無効にしてテストします。

IEブラウザでの動作しない

古いブラウザではClipboard APIのサポート状況が異なります。対応が必要な場合は、ActiveXコントロールやFlashベースの代替実装の使用を検討してください。

まとめ

CKEditorでWord画像の貼り付け機能を実装するには、以下の要素が必要です:

  1. クリップボード画像を処理するJavaScriptライブラリ
  2. 画像ファイルを受け取るサーバーサイドAPI
  3. 適切な設定(エンドポイント、認証、レスポンス形式)

この機能を実装することで、ユーザーのコンテンツ作成効率を大幅に向上させることができます。特に頻繁にニュース記事やブログ記事を公開するサイトで有効な機能です。

タグ: ckeditor Word 画像アップロード Web開発 貼り付け機能

7月2日 17:07 投稿