web-dev-qa-db-ja.com

CKEDITOR、画像アップロード(filebrowserUploadUrl)

私はCKEDITORを使用していますが、ユーザーが画像をテキストエディタにアップロードして埋め込むことができるようにしたいと思います...

次のJSは、CKEDITORをロードするものです。

CKEDITOR.replace( 'meeting_notes',
    {
        startupFocus : true,
        toolbar :
            [
                ['ajaxsave'],
                ['Bold', 'Italic', 'Underline', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink' ],
                ['Cut','Copy','Paste','PasteText'],
                ['Undo','Redo','-','RemoveFormat'],
                ['TextColor','BGColor'],
                ['Maximize', 'Image']
            ],
        filebrowserUploadUrl : '/notes/add/ajax/upload-inline-image/index.cfm'
    }
);

私が立ち往生しているのはfilebrowserUploadUrlです...このプロセスを動作させるためにCKEDITORに戻るはずのURLは何ですか?

ありがとう

36
AnApprentice

URLは、独自のカスタムファイルブラウザURLを指している必要があります。

私はすでに自分のプロジェクトの1つでこれを行っており、このトピックに関するチュートリアルをブログに投稿しました

http://www.mixedwaves.com/2010/02/integrating-fckeditor-filemanager-in-ckeditor/

チュートリアルでは、独自に作成したくない場合に、CKEditorにFCKEditorの組み込みFileBrowserを統合する方法について、手順を追って説明します。とても簡単です。

44
Penuel

手遅れかもしれません。コードは正しいので、filebrowserUploadUrlのURLをもう一度確認してください

CKEDITOR.replace( 'editor1', {
    filebrowserUploadUrl: "upload/upload.php" 
} );

そして、Upload.phpファイル

if (file_exists("images/" . $_FILES["upload"]["name"]))
{
 echo $_FILES["upload"]["name"] . " already exists. ";
}
else
{
 move_uploaded_file($_FILES["upload"]["tmp_name"],
 "images/" . $_FILES["upload"]["name"]);
 echo "Stored in: " . "images/" . $_FILES["upload"]["name"];
}
14

新しいCKeditorにはファイルマネージャーが含まれていません(CKFinderは有料です)。見栄えが良く、CKeditorに簡単に実装できる無料のファイルマネージャーを統合できます。

http://labs.corefive.com/2009/10/30/an-open-file-manager-for-ckeditor-3-0/

ダウンロードして、プロジェクトにコピーします。すべての手順はありますが、基本的には、追加したfilemanager index.htmlページへのパスをコードに追加するだけです。

CKEDITOR.replace( 'meeting_notes',
{
startupFocus : true,
toolbar :
[
['ajaxsave'],
['Bold', 'Italic', 'Underline', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink' ],
['Cut','Copy','Paste','PasteText'],
['Undo','Redo','-','RemoveFormat'],
['TextColor','BGColor'],
['Maximize', 'Image']
],
filebrowserUploadUrl : '/filemanager/index.html' // you must write path to filemanager where you have copied it.
});    

ほとんどの言語がサポートされています(php、asp、MVC && aspx-ashx、...))。

5
Azoro

CKFinderを購入したくないなど、CKFinderを購入する必要がない場合は、CKEditor 4の非常に信頼性の高いアップローダーを作成しました。 iframe hackは、その名前にもかかわらず、シームレスで目立たないものです。

画像が正常にアップロードされると、CKEditorウィンドウに、すでにそこにあるコンテンツとともに表示されます。

editor.php(フォームページ):

<?php
set_time_limit ( 3600 )
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Content Editor</title>
<link href="jquery-ui-1.10.2/themes/vader/ui.dialog.css" rel="stylesheet" media="screen" id="dialog_ui" />
<link href="jquery-ui-1.10.2/themes/vader/jquery-ui.css" rel="stylesheet" media="screen" id="dialog_ui" />
<script src="jquery-ui-1.10.2/jquery-1.9.1.js"></script>
<script src="jquery-ui-1.10.2/jquery.form.js"></script>
<script src="jquery-ui-1.10.2/ui/jquery-ui.js"></script>
<script src="ckeditor/ckeditor.js"></script>
<script src="ckeditor/config.js"></script>
<script src="ckeditor/adapters/jquery.js"></script>
<script src="ckeditor/plugin2.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    $('#editor').ckeditor({ height: 400, width:600});
});

function placePic(){

    function ImageExist(url){
       var img = new Image();
       img.src = url;
       return img.height != 0;
    }

var filename = document.forms['uploader']['uploadedfile'].value;
document.forms['uploader']['filename'].value = filename;
var url = 'http://www.mydomain.com/external/images/cms/'+filename;
document.getElementById('uploader').submit();
var string = CKEDITOR.instances.editor.getData();
var t = setInterval(function(){

            var exists = ImageExist(url);
            if(exists === true){
                    if(document.getElementById('loader')){
                        document.getElementById('loader').parentNode.removeChild(document.getElementById('loader'));
                    }
                    CKEDITOR.instances.editor.setData(string + "<img src=\""+url+"\" />");
                    clearInterval(t);
            }
            else{
                if(! document.getElementById("loader")){
                    var loader = document.createElement("div");
                    loader.setAttribute("id","loader");
                    loader.setAttribute("style","position:absolute;margin:-300px auto 0px 240px;width:113px;height:63px;text-align:center;z-index:10;");
                    document.getElementById('formBox').appendChild(loader);

                    var loaderGif = document.createElement("img");
                    loaderGif.setAttribute("id","loaderGif");
                    loaderGif.setAttribute("style","width:113px;height:63px;text-align:center;");
                    loaderGif.src = "external/images/cms/2dumbfish.gif";
                    document.getElementById('loader').appendChild(loaderGif);
                }
            }

            },100);
}

function loadContent(){
if(document.forms['editorform']['site'].value !== "" && document.forms['editorform']['page'].value !== ""){
    var site = document.forms['editorform']['site'].value;
    var page = document.forms['editorform']['page'].value;
    var url = site+"/"+page+".html";
    $.ajax({
        type: "GET",
        url: url,
        dataType: 'html',
        success: function (html) {
            CKEDITOR.instances.editor.setData(html);
        }
    });
}
}
</script>
<style>
button{
  width: 93px;
  height: 28px;
  border:none;
  padding: 0 4px 8px 0;
  font-weight:bold
}
#formBox{
    width:50%;
margin:10px auto 0px auto;
font-family:Tahoma, Geneva, sans-serif;
font-size:12px;
}
#field{
position:absolute;
top:10px;
margin-left:300px;
margin-bottom:20px;
}
#target{
position:absolute;
top:100px;
left:100px;
width:400px;
height:100px;
display:none;
}
.textField{
    padding-left: 1px;
border-style: solid;
border-color: black;
border-width: 1px;
font-family: helvetica, arial, sans serif;
padding-left: 1px;
}
#report{
float:left;
margin-left:20px;
margin-top:10px;
font-family: helvetica, arial, sans serif;
font-size:12px;
color:#900;
}
</style>
</head>

<body>
<?php
if(isset($_GET['r'])){ ?><div id="report">
<?php echo $_GET['r']; ?> is changed.
</div><?php
}
?>
<div id="formBox">
<form id="uploader" name="uploader" action="editaction.php"  method="post" target="target" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="50000000" />
<input type="hidden" name="filename" value="" />
Insert image:&nbsp;<input name="uploadedfile" type="file" class="textField" onchange="placePic();return false;" />&nbsp;&nbsp;
</form>

<form name="editorform" id="editorform" method="post" action="editaction.php" >
<div id="field" >Site:&nbsp;<select name="site"  class="textField" onchange="loadContent();return false;">
    <option value=""></option>
    <option value="scubatortuga">scubatortuga</option>
    <option value="drytortugascharters">drytortugascharters</option>
    <option value="keyscombo">keyscombo</option>
    <option value="keywesttreasurehunters">keywesttreasurehunters</option>
    <option value="spearfishkeywest">spearfishkeywest</option>
</select>
Page:&nbsp;<select name="page" class="textField" onchange="loadContent();return false;">
    <option value=""></option>
    <option value="one">1</option>
    <option value="two">2</option>
    <option value="three">3</option>
    <option value="four">4</option>
</select>
</div><br />
<textarea name="editor" id="editor"></textarea><br />
<input type="submit" name="submit" value="Submit" />
</form>
</div>
<iframe name="target" id="target"></iframe>
</body>
</html>

そして、実際のファイルのアップロードを行うアクションページeditaction.phpを次に示します。

<?php
//editaction.php

foreach($_POST as $k => $v){
    ${"$k"} = $v;
}
//fileuploader.php
if($_FILES){
  $target_path = "external/images/cms/";
  $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 
  if(! file_exists("$target_path$filename")){
    move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path);
  }
}
else{
    $string = stripslashes($editor);
    $filename = "$site/$page.html";
    $handle = fopen($filename,"w");
    fwrite($handle,$string,strlen($string));
    fclose($handle);
    header("location: editor.php?r=$filename");
}
?>
3
TARKUS

CKeditorバージョン4を使用すると、エディターはサーバー側から返されるJSONを期待します。古いバージョンでは、javascriptスニペットを含むtext/htmlタイプの応答が必要になる場合があります。その説明については、このリンクを参照してください 戻り形式の説明 。サーバー側で、C#を使用している場合、次のようなデータモデルを作成できます。

namespace editors.Models
{
    public class PostModel
    {
        public string CKEditor { get; set; }  // for older editors
        public string CKEditorFuncNum { get; set; }  // for older editors
        public string langCode { get; set; }  // for older editors
        public int uploaded { get; set; } 
        public string filename { get; set; }
    }
}

そして、これでアップロードルーチンから結果を返します:

PostModel fez = new PostModel { CKEditor = "TheEditor1", CKEditorFuncNum = "1", langCode = "en", uploaded = 1, filename = "/images/in/" + filenameVariable };
return Ok(fez);

.netはおそらくjsonを自動的に作成しますが、必ずコンテンツタイプapplication/jsonを返すようにしてください。

アップロードされたファイルが実際に画像ファイルであるかどうかを確認したい場合の補足として。 Asp.netコアを使用している場合、system.drawingライブラリを非標準の方法でインストールする必要があります。 これを行う方法は次のとおりです

また、config.jsファイルの投稿の種類をconfig.filebrowserUploadMethod = 'form';に変更できることに注意してくださいconfig.filebrowserUploadMethod = 'xhr';

2
netfed

私の最新の問題は、CKEditorで画像をアップロードするためにCKFinderを統合する方法でした。ここで解決策。

  1. CKEditorをダウンロードして、Webフォルダーのルートに展開します。

  2. CKFinderをダウンロードし、ckeditorフォルダーから抽出します。

  3. 次に、CKEditor、CKFinderへの参照を追加して、

     <CKEditor:CKEditorControl ID="CKEditorControl1" runat="server"></CKEditor:CKEditorControl>
    

    aspxページに。

  4. コードビハインドページOnLoadイベントで、このコードスニペットを追加します。

    protected override void OnLoad(EventArgs e)
    {
      CKFinder.FileBrowser _FileBrowser = new CKFinder.FileBrowser();
      _FileBrowser.BasePath = "ckeditor/ckfinder/";
      _FileBrowser.SetupCKEditor(CKEditorControl1);
    }
    
  5. Confic.ascxファイルを編集します。

    public override bool CheckAuthentication()
    {
      return true;
    }
    
    // Perform additional checks for image files.
    SecureImageUploads = true;
    

ソース

2
lasantha

Grails ckeditorプラグインで同じ問題が発生している場合

filebrowserUploadUrl: '/ YourAppName/ck/ofm'

画像のアップロードを処理する関数を呼び出すe。独自のカスタマイズされた関数を使用する場合は、そのファイルパスを指定できます。

1

このシンプルなデモは、あなたが欲しいものを手に入れるのに役立つかもしれません。以下は、画像をアップロードする場所からのhtml/phpコードです。

<html>
<head>
 <script src="http://cdn.ckeditor.com/4.6.2/standard-all/ckeditor.js"></script>
  </head>
<body>
<form  action="index.php" method="POST"  style="width:500xp;">

<textarea rows="5" name="content" id="content"></textarea>

<br>
<input type="submit" name="submit" value="Post">

</form>
<script>
 CKEDITOR.replace( 'content', {
  height: 300,
  filebrowserUploadUrl: "upload.php"
 });
</script>
</body>
</html>

そして、これがupload.phpファイルのコードです。

 <?php
if(isset($_FILES['upload']['name']))
{
 $file = $_FILES['upload']['tmp_name'];
 $file_name = $_FILES['upload']['name'];
 $file_name_array = explode(".", $file_name);
 $extension = end($file_name_array);
 //we want to save the image with timestamp and randomnumber
 $new_image_name = time() . Rand(). '.' . $extension;
 chmod('upload', 0777);
 $allowed_extension = array("jpg", "gif", "png");
 if(in_array($extension, $allowed_extension))
 {
  move_uploaded_file($file, 'upload/' . $new_image_name);
  $function_number = $_GET['CKEditorFuncNum'];
  $url = 'upload/' . $new_image_name;
  $message = '';
  echo "<script type='text/javascript'>window.parent.CKEDITOR.tools.callFunction($function_number, '$url', '$message');</script>";
 }
}
?>

注:同じフォルダに「アップロード」フォルダを作成し、3つのファイルすべてを同じディレクトリに保存することを忘れないでください。それがどのように機能するかを理解したら、後でディレクトリを変更できます。また、下の図に示すように、サーバーに送信することを忘れないでください。

screenshot

1
Ashiq Khan

最近、これに対する回答も必要になりましたが、それを理解するのに数時間かかりました。そこで、いくつかの最新情報と完全な回答でこの質問を復活させることにしました。

最終的に私はつまずいた このチュートリアル それは私にそれをかなりよく説明した。 stackoverflowのため、チュートリアルが削除された場合に備えて、ここでチュートリアルを繰り返します。また、これをより柔軟なソリューションにするために、チュートリアルに加えたいくつかの変更も含めます。


入門

Ckeditorのリリースのいずれかから始めましょう(基本、標準、フル、カスタム)唯一の要件は、アドオン image および filebrowser があることです

(これを書いている時点では、すべてのパッケージには基本的なものを除くこれら2つのアドオンが含まれていますが、基本的なものに追加できます)

必要なckeditorファイルをアップロードしたら、インストールが機能していることを確認してください。

Ckeditor.jsファイルスクリプト_<script src="ckeditor/ckeditor.js"></script>_をリンクしてから、次のように初期化してください。

_$(document).ready(function() {
    CKEDITOR.replace( 'editor1' );
});
<textarea name="editor1"></textarea>
_

CKEditor設定

次に、アップロードを有効にすることをCKEditorに通知する必要があります。これを行うには、ckeditorフォルダーに移動し、「config.js」を編集します。次の行を追加する必要があります。

_config.filebrowserUploadUrl = '/uploader/upload.php';_メイン関数E.G内のどこか

_CKEDITOR.editorConfig = function( config ) {
    // Define changes to default configuration here. For example:
    // config.language = 'fr';
    // config.uiColor = '#AADC6E';

    config.filebrowserUploadUrl = '/uploader/upload.php';
};
_

注:このURLは、プロジェクトルートからのものです。このファイルのロード元に関係なく、サイトインデックスから開始されます。つまり、URLがexample.comの場合、このURLは_http://example.com/uploader/upload.php_につながります

この後、CKEditorの構成が完了しました!簡単だった?

実際、今すぐ画像のアップロードを再度テストすると、アップロードオプションが表示されますが、まだ機能しません。

enter image description here


サーバー構成

これで、このステップの前のステップで、_upload.php_ファイルで終わることがわかります。これは私を困惑させた部分です、私はこれで行くことができるいくつかのデフォルトがあると思ったが、私が知る限りではないことを知っています。幸いなことに、私は動作するものを見つけ、それをさらにカスタマイズできるように変更を加えました。

したがって、最後のステップで指定したパスに進みましょう。このチュートリアルを継続するために、_/uploader/upload.php_を使用します。

この場所で、(推測した)_upload.php_というファイルを作成します。

このファイルはファイルのアップロードを処理します。

カスタムアップロードクラスに入れますが、それは this github に基づいており、見つけて分岐しました。

upload.php:

_<?php
// Upload script for CKEditor.
// Use at your own risk, no warranty provided. Be careful about who is able to access this file
// The upload folder shouldn't be able to upload any kind of script, just in case.
// If you're not sure, hire a professional that takes care of adjusting the server configuration as well as this script for you.
// (I am not such professional)

// Configuration Options: Change these to alter the way files being written works
$overwriteFiles = false;

//THESE SETTINGS ONLY MATTER IF $overwriteFiles is FALSE

    //Seperator between the name of the file and the generated ending.
    $keepFilesSeperator = "-"; 

    //Use "number" or "random". "number" adds a number, "random" adds a randomly generated string.
    $keepFilesAddonType = "random"; 

    //Only usable when $keepFilesAddonType is "number", this specifies where the number starts iterating from.
    $keepFilesNumberStart = 1; 

    //Only usable when $keepFilesAddonType is "random", this specifies the length of the string.
    $keepFilesRandomLength = 4; 

//END FILE OVERWRITE FALSE SETTINGS

// Step 1: change the true for whatever condition you use in your environment to verify that the user
// is logged in and is allowed to use the script
if (true) {
    echo("You're not allowed to upload files");
    die(0);
}

// Step 2: Put here the full absolute path of the folder where you want to save the files:
// You must set the proper permissions on that folder (I think that it's 644, but don't trust me on this one)
// ALWAYS put the final slash (/)
$basePath = "/home/user/public_html/example/pages/projects/uploader/files/";

// Step 3: Put here the Url that should be used for the upload folder (it the URL to access the folder that you have set in $basePath
// you can use a relative url "/images/", or a path including the Host "http://example.com/images/"
// ALWAYS put the final slash (/)
$baseUrl = "http://example.com/pages/projects/uploader/files/";

// Done. Now test it!



// No need to modify anything below this line
//----------------------------------------------------

// ------------------------
// Input parameters: optional means that you can ignore it, and required means that you
// must use it to provide the data back to CKEditor.
// ------------------------

// Optional: instance name (might be used to adjust the server folders for example)
$CKEditor = $_GET['CKEditor'] ;

// Required: Function number as indicated by CKEditor.
$funcNum = $_GET['CKEditorFuncNum'] ;

// Optional: To provide localized messages
$langCode = $_GET['langCode'] ;

// ------------------------
// Data processing
// ------------------------

// The returned url of the uploaded file
$url = '' ;

// Optional message to show to the user (file renamed, invalid file, not authenticated...)
$message = '';

// in CKEditor the file is sent as 'upload'
if (isset($_FILES['upload'])) {
    // Be careful about all the data that it's sent!!!
    // Check that the user is authenticated, that the file isn't too big,
    // that it matches the kind of allowed resources...
    $name = $_FILES['upload']['name'];

    //If overwriteFiles is true, files will be overwritten automatically.
    if(!$overwriteFiles) 
    {
        $ext = ".".pathinfo($name, PATHINFO_EXTENSION);
        // Check if file exists, if it does loop through numbers until it doesn't.
        // reassign name at the end, if it does exist.
        if(file_exists($basePath.$name)) 
        {
            if($keepFilesAddonType == "number") {
                $operator = $keepFilesNumberStart;
            } else if($keepFilesAddonType == "random") {
                $operator = bin2hex(openssl_random_pseudo_bytes($keepFilesRandomLength/2));
            }
            //loop until file does not exist, every loop changes the operator to a different value.
            while(file_exists($basePath.$name.$keepFilesSeperator.$operator)) 
            {
                if($keepFilesAddonType == "number") {
                    $operator++;
                } else if($keepFilesAddonType == "random") {
                    $operator = bin2hex(openssl_random_pseudo_bytes($keepFilesRandomLength/2));
                }
            }
            $name = rtrim($name, $ext).$keepFilesSeperator.$operator.$ext;
        }
    }
    move_uploaded_file($_FILES["upload"]["tmp_name"], $basePath . $name);

    // Build the url that should be used for this file   
    $url = $baseUrl . $name ;

    // Usually you don't need any message when everything is OK.
//    $message = 'new file uploaded';   
}
else
{
    $message = 'No file has been sent';
}
// ------------------------
// Write output
// ------------------------
// We are in an iframe, so we must talk to the object in window.parent
echo "<script type='text/javascript'> window.parent.CKEDITOR.tools.callFunction($funcNum, '$url', '$message')</script>";

?>
_

このクラスに加えた変更により、ファイルの上書きを有効/無効にすることができ、ファイルを上書きしたくない場合にいくつかのオプションが提供されます。元のクラスは常にオプションなしで上書きされます。

デフォルトでは、このクラスは上書きせずにすべてのファイルを保持するように設定されています。ニーズに合わせてこれらの設定をいろいろ試してみてください。

お気付きの方は、ただif(true)ステートメントであるコードのセクションがあります。

_if (true) {
    echo("You're not allowed to upload files");
    die(0);
}
_

これはセキュリティのためです。ここで、アップロードするユーザーがログインしているか、アップロードを許可されているかどうかを確認する必要があります。気にならない場合は、これらのコード行を削除するか、if(false)(NOT RECOMMENDED)に設定するだけです。

また、サーバーのニーズに合わせて_$basePath_および_$baseUrl_変数を編集する必要があります。そうしないと機能しません。あなたが遊んでみたいと思わない限り、それ以下はすべてそのままにしておくことができます。

このクラスはファイル保護を提供しません。ユーザーがスクリプトやウイルスをサーバーにアップロードできないように、このクラスを使用してより安全にすることができます。


この小さなチュートリアルが誰かを助けてくれることを願っています。私がこれを自分自身のために働かせようと長い間働いていたので、私は誰か他の人を救うことができることを望みます。

上にリンクしたチュートリアルには、トラブルシューティングの手順がいくつかあります。これは、何か問題が発生した場合に何が間違っているのかを見つけるのに役立ちます。

enter image description here

0
GrumpyCrouton

このコードを使用できます

     <script>
                // Replace the <textarea id="editor"> with a CKEditor
                // instance, using default configuration.

                CKEDITOR.config.filebrowserImageBrowseUrl = '/admin/laravel-filemanager?type=Files';
                CKEDITOR.config.filebrowserImageUploadUrl = '/admin/laravel-filemanager/upload?type=Images&_token=';
                CKEDITOR.config.filebrowserBrowseUrl = '/admin/laravel-filemanager?type=Files';
                CKEDITOR.config.filebrowserUploadUrl = '/admin/laravel-filemanager/upload?type=Files&_token=';

                CKEDITOR.replaceAll( 'editor');
   </script>
0
Turan Zamanlı

そのURLは、独自のサーバー側のファイルアップロードアクションを指します。ドキュメントの詳細は説明しませんが、幸いにもDon Jonesがいくつかの空白を埋めています:

カスタムファイルブラウザー/アップローダーをCKEditorと統合するにはどうすればよいですか?

こちらもご覧ください:

http://zerokspot.com/weblog/2009/09/09/custom-filebrowser-callbacks-ckeditor/

0
ZoogieZork