Как да качите и инжектирате изображение в tinymce 4 с помощта на Asp.net MVC

Така че, тъй като няма абсолютно никакъв модерен начин за безплатно качване на изображения в tinymce в .net, мислех може би да добавя вход за качване на файл в html, след което го качете на сървър с помощта на ajax и след това включете файла в редактора на tinymce.

Проблемът е при инжектиране на изображение в tinymce, не знам как да...

има ли някакъв начин


person Vahid Amiri    schedule 09.11.2015    source източник
comment
Да, има начин, последният ми проект го направи, мога да публикувам код тази вечер, ако никой не е отговорил дотогава, не си спомням на върха на главата как беше постигнато.   -  person Daniel Hoffmann-Mitscherling    schedule 10.11.2015
comment
Току-що го направих и работи добре! виж другия ми пост (отговор)   -  person Vahid Amiri    schedule 10.11.2015


Отговори (5)


Добре, Micro$oft или някой друг наистина трябва да направи нещо по въпроса, междувременно тук е резултатът от часове отстраняване на грешки:

Това решение използва функция за директно качване (вече има в Tinymce, но е деактивирана по подразбиране) и с някои jquery хакове инжектираме изображението в текстовото поле.

Промяната на размерите трябва да се извърши след инжектиране на изображението. В последните версии на Tinymce те също добавиха някои хубави инструменти за редактиране на изображения, които също работят с този метод.

Сега кодът:

Това е действието, което трябва да бъде поставено в контролер: (Внимавайте за маршрутизирането)

public string Upload(HttpPostedFileBase file)
    {
        string path;
        string saveloc = "~/Images/";
        string relativeloc = "/Images/";
        string filename = file.FileName;

        if (file != null && file.ContentLength > 0 && file.IsImage())
        {
            try
            {
                path = Path.Combine(HttpContext.Server.MapPath(saveloc), Path.GetFileName(filename));
                file.SaveAs(path);
            }
            catch (Exception e)
            {
                return "<script>alert('Failed: " + e + "');</script>";
            }
        }
        else
        {
            return "<script>alert('Failed: Unkown Error. This form only accepts valid images.');</script>";
        }

        return "<script>top.$('.mce-btn.mce-open').parent().find('.mce-textbox').val('" + relativeloc + filename + "').closest('.mce-window').find('.mce-primary').click();</script>";
    }

И това е пълният код за Tinymce, той ще генерира текстово поле и няколко скрити полета. Той също така ще направи екземпляр на tinymce с активирани някои добавки.

    <iframe id="form_target" name="form_target" style="display:none"></iframe>

<form id="my_form" action="/admin" target="form_target" method="post" enctype="multipart/form-data" style="width:0;height:0;overflow:hidden">
    <input name="file" type="file" onchange="$('#my_form').submit();this.value='';">
</form>
<script type="text/javascript">
tinymce.init({
    selector: "textarea",
    theme: "modern",
    plugins: [
        "advlist autolink lists link image charmap print preview hr anchor pagebreak",
        "searchreplace wordcount visualblocks visualchars code fullscreen",
        "insertdatetime media nonbreaking save table contextmenu directionality",
        "emoticons template paste textcolor colorpicker textpattern imagetools"
    ],
    toolbar1: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
    toolbar2: "print preview media | forecolor backcolor emoticons | ltr rtl",
    image_advtab: true,
    templates: [
        {title: 'Test template 1', content: 'Test 1'},
        {title: 'Test template 2', content: 'Test 2'}
    ],
    file_browser_callback: function(field_name, url, type, win) {
    if(type=='image') $('#my_form input').click();
}
});
</script>

<textarea id="my_editor" class="mceEditor">This will be an editor.</textarea>

Трябва да създадете папка с име „Изображения“ в корена на вашия проект за качване на изображения. Нуждаете се също от Tinymce js файл и jquery.

Променете действието на формуляра според вашите настройки!!!

Можете също да изберете да използвате html помощници. Не ги харесвам. но ако желаете, използвайте ги вместо тази ръчно изработена форма.

Идеята е от тук, но беше направено в python, така че го пренаписах, за да работи с ASP.NET MVC5 и най-новата версия на TinyMCE.

Ще продължа да работя по това през следващите няколко дни и ще редактирам този отговор, ако е необходимо.

person Vahid Amiri    schedule 09.11.2015
comment
Здравейте, можете ли да ми помогнете малко, за да разбера съвпадението на полета и формуляри в javascript? Искам да кажа, нека кажем какво трябва да поставя в field_name? Успявам да покажа иконата, но тя е неактивна. Благодаря ти - person touinta; 18.04.2016
comment
@touinta, тествах този код на TinyMCE 4.2 и работи добре, не съм сигурен за други версии. Коя версия използвате? - person Vahid Amiri; 18.04.2016
comment
Къде използвате действието си за качване? Няма url във вашия js код, сочещ към това действие. - person VincentZHANG; 01.11.2016
comment
@VincentZHANG След iframe има маркер form и има атрибут action, който трябва да сочи към вашия метод на действие. В горния код той сочи към /admin - person Vahid Amiri; 01.11.2016
comment
@VSG24 Благодаря ви, това е хубаво решение, изглежда работи перфектно с TinyMCE 4.4.3 и MVC 5. - person VincentZHANG; 01.11.2016

Направих това в TinyMCE 4.3.10

В tinymce.init поставете тези опции:

paste_data_images: true,
images_upload_url: '/YourController/UploadImage',
images_upload_base_path: '/some/basepath'

В кода на CSharp:

public ActionResult UploadImage(HttpPostedFileBase file)
{
    file.SaveAs("<give it a name>");
    return Json(new { location = "<url to that file>" });
}

Трябва да можете да копирате и поставите изображение във вашето текстово поле (странно, плъзгане и пускане вече не работи).

person s k    schedule 23.04.2016
comment
Да работи. IIRC във вашия манипулатор на file_picker_callback открива дали е локален файл. Прочетете, кодирайте го с Base64, след което го вмъкнете като вградено изображение с помощта на insertContent(). Горният код все още ще бъде извикан. Ще актуализирам отговора си по-късно утре. - person s k; 23.04.2016
comment
Използвам 4.4.3 и тази конфигурация не показва бутона за преглеждане на файл в диалоговия прозорец на изображението. - person VincentZHANG; 01.11.2016

това е моята конфигурация за най-новата версия на tinymce..

File_browser_callback се амортизира

..и работи..това работи при копиране и поставяне, вмъкване на изображение. Все още не съм пробвал с мениджъра за качване на файлове

         automatic_uploads: true, << auto run your upload script

         images_upload_url: 'ImageUpload', <<your upload, I'm using mvc and I'm routing to "ImageUpload"

        images_reuse_filename:true, << this is where the return json from your code i had a hard time finding this out.  

       file_picker_types: 'image', << type where the upload will appear images dialog,link or file

        //custom file picker       
        file_picker_callback: function (cb, value, meta) {
        var input = document.createElement('input');
        input.setAttribute('type', 'file');
        input.setAttribute('accept', 'image/*');

        // Note: In modern browsers input[type="file"] is functional without 
        // even adding it to the DOM, but that might not be the case in some older
        // or quirky browsers like IE, so you might want to add it to the DOM
        // just in case, and visually hide it. And do not forget do remove it
        // once you do not need it anymore.

        input.onchange = function () {
            var file = this.files[0];

            // Note: Now we need to register the blob in TinyMCEs image blob
            // registry. In the next release this part hopefully won't be
            // necessary, as we are looking to handle it internally.
            var id = 'blobid' + (new Date()).getTime();
            var blobCache = tinymce.activeEditor.editorUpload.blobCache;
            var blobInfo = blobCache.create(id, file);
            blobCache.add(blobInfo);
            console.log(id);
            console.log(blobCache);
            // call the callback and populate the Title field with the file name
            cb(blobInfo.blobUri(), { title: file.name });
            console.log(meta.filetype);



        };

        input.click();


    },
person CyberNinja    schedule 06.01.2017

Работя в JSF/Java уеб приложение и този код в tynymce.init javascript по-долу работи добре за мен. Снимките се записват в средата на текстовото поле (предполагам). Предполагам, че няма нужда от допълнителен код

tinymce.init({
      selector: "textarea",
      browser_spellcheck: true,
      paste_data_images: true,
      plugins: [
        "advlist autolink autosave link image lists charmap print preview hr anchor pagebreak spellchecker",
        "searchreplace wordcount visualblocks visualchars code fullscreen insertdatetime media nonbreaking",
        "table contextmenu directionality template textcolor paste fullpage textcolor colorpicker textpattern"
      ],

      toolbar1: "bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | formatselect fontselect fontsizeselect",
      toolbar2: "cut copy paste | searchreplace | bullist numlist | outdent indent blockquote | undo redo | link unlink anchor image code | insertdatetime preview | forecolor backcolor",
      toolbar3: "table | hr removeformat | subscript superscript | charmap emoticons | print fullscreen | ltr rtl | spellchecker | visualchars visualblocks nonbreaking template pagebreak restoredraft",

      menubar: false,
      image_advtab: true,
      toolbar_items_size: 'small',

      file_picker_callback: function(callback, value, meta) {
          if (meta.filetype == 'image') {
                var inputFile = document.createElement("INPUT");
                inputFile.setAttribute("type", "file");
                inputFile.setAttribute("style","display: none");
                inputFile.click();
                inputFile.addEventListener("change", function() {
                var file = this.files[0];
                var reader = new FileReader();
                reader.onload = function(e) {
                  callback(e.target.result, {
                    alt: ''
                  });
                };
                reader.readAsDataURL(file);
             });
          }
        },

      insertdatetime_dateformat: "%d/%m/%Y",
      insertdatetime_timeformat: "%H:%M:%S",
      language: 'pt_BR',
    });
person Dustan Cardoso    schedule 07.04.2017

HTML

API_KEY - заменете с вашия за tinymce Selector - заменете MVC контролера в областта "Контрол"

  <script src="https://cdn.tiny.cloud/1/API_KEY/tinymce/5/tinymce.min.js"></script>
    <script>
        tinymce.init({
            selector: '#Body',
            menubar: ' edit view insert format tools table',
            toolbar: 'undo redo | bold italic underline strikethrough | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent |  numlist bullist  | forecolor backcolor removeformat | emoticons | fullscreen  | image media  link | code',
            plugins: 'code importcss  searchreplace autolink   visualblocks visualchars fullscreen image link media   codesample table charmap hr  nonbreaking anchor toc insertdatetime advlist lists  wordcount   imagetools textpattern noneditable   charmap   quickbars  emoticons',
            contextmenu: "link image imagetools table",
            image_advtab: true,
            toolbar_sticky: true,
            images_upload_url: '/Control/Home/UploadImage',
            paste_data_images: true,
        });
    </script>

C#

namespace Project.Areas.Control.Controllers
{
    [Authorize(Roles = "admin")]
    public class HomeController : WebBaseController
    {

        [HttpPost]
        public JsonResult UploadImage(HttpPostedFileBase file)
        {
            var uploadsPath = HostingEnvironment.MapPath($"/uploads");
            var uploadsDir = new DirectoryInfo(uploadsPath);
            if (!uploadsDir.Exists)
                uploadsDir.Create();

            var imageRelativePath = $"/uploads/{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.jpg";
            var imageAbsPath = HostingEnvironment.MapPath(imageRelativePath);
            var imageBytes = file.InputStream.ReadToEnd();
            System.IO.File.WriteAllBytes(imageAbsPath, imageBytes);
            return Json(new { location = imageRelativePath });
        }
.....

Метод на разширение

public static byte[] ReadToEnd(this Stream input)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                input.CopyTo(ms);
                return ms.ToArray();
            }
        }
person Paul    schedule 18.11.2019