RadEditor.ImageManager не вставляет изображение при нажатии кнопки Вставить

#telerik #radeditor

#telerik #radeditor

Вопрос:

У меня есть элемент управления RadEditor с включенным ImageManager. эта функция отлично работала в нашей последней версии, которая у нас была (версия 2011 года), но теперь с имеющейся у нас версией диспетчер изображений не вставляет выбранное изображение. Ниже приведен мой HTML-тег RadEditor:

 <telerik:RadEditor ID="txtRTE"
SpellCheckSettings-AllowAddCustom="false"
ToolsFile="~/SimpleRTEEditorTools.xml"
OnClientLoad="HandleRTEClientLoad"
ExternalDialogsPath="~/RadControls/EditorDialogs/"
runat="server"
Height="200"
Skin="Default"
EditModes="Design"
AllowScripts="false"
StripFormattingOptions="All">
<ImageManager ViewPaths=".." UploadPaths=".." SearchPatterns="*.jpg,*.gif,*.png" EnableImageEditor="False" ViewMode="Grid" />
  

Я редактирую пути просмотра и пути загрузки в коде метода page_load:

 txtRTE.ImageManager.ViewPaths = paths;
txtRTE.ImageManager.UploadPaths = paths;
txtRTE.ImageManager.ContentProviderTypeName = typeof(FolderContentProvider).AssemblyQualifiedName;
  

Мы внедрили наш собственный контент-провайдер, как показано ниже:

 public class FolderContentProvider : FileBrowserContentProvider
    {
        private string ROOT_DIRECTORY_FULL_PATH = 
            //Path to record documents folder
            System.Configuration.ConfigurationManager.AppSettings[Constants.RECORD_DOC_ROOT_FOLDER_APP_KEY].ToString()   
            //folder containing images
            Constants.Record_DOC_FORM_TEXT_IMAGE_FOLDER   "\"  
            //to get Record ID
            ((MyAppPrincipal)System.Threading.Thread.CurrentPrincipal).Record.ID;

         public string RootDirectory
        {
            get
            {
                return ROOT_DIRECTORY_FULL_PATH;
            }
            private set
            {

            }
        }

        private PathPermissions fullPermissions = PathPermissions.Read | PathPermissions.Upload;

        private DirectoryItem[] GetSubDirectories(string path)
        {
            //we have only one directory no sub directories
            //no need to go to file system to find that out
            return new DirectoryItem[0];
        }

        private string GetDirectoryFullPath(string path)
        {
            return RootDirectory;
        }

        private FileItem[] GetFiles(string path)
        {
            string[] filesFullName = Directory.GetFiles(RootDirectory);
            ArrayList files = new ArrayList();
            for (int i = 0; i < filesFullName.Length; i  )
            {
                string fullPath = filesFullName[i];
                System.IO.FileInfo currentFile = new System.IO.FileInfo(fullPath);
                if (IsAlowedFileExtension(currentFile.Extension))
                {
                    string url = string.Format("{0}?path={1}", HttpContext.Current.Request.ApplicationPath   "/app/FormTextImageHandler.ashx", currentFile.Name);

                    files.Add(new FileItem(
                        currentFile.Name, //file name
                        currentFile.Extension, //extension
                        currentFile.Length, //size
                        string.Empty,//currentFile.FullName, //location
                        url, //url
                        string.Empty,//tag
                        fullPermissions//permissions
                        )); 
                }
            }
            return (FileItem[])files.ToArray(typeof(FileItem));
        }

        private bool IsAlowedFileExtension(string Extension)
        {
            if (Extension.Equals(".gif", StringComparison.InvariantCultureIgnoreCase))
                return true;
            if (Extension.Equals(".jpg", StringComparison.InvariantCultureIgnoreCase))
                return true;
            if (Extension.Equals(".png", StringComparison.InvariantCultureIgnoreCase))
                return true;
            return false;
        }

        public FolderContentProvider(HttpContext context, string[] searchPatterns, string[] viewPaths, string[] uploadPaths, string[] deletePaths, string selectedUrl, string selectedItemTag)
            : base(context, searchPatterns, viewPaths, uploadPaths, deletePaths, selectedUrl, selectedItemTag)
        {
        }

        public override string DeleteFile(string path)
        {
            //we do not allow removing files
            return null;
        }

        public override string DeleteDirectory(string path)
        {
            //we don't have any sub directories
            //and moreover we don't give delete rights
            return null;
        }

        public override string StoreFile(Telerik.Web.UI.UploadedFile file, string path, string name, params string[] arguments)
        {
            int fileLength = (int)file.InputStream.Length;
            byte[] content = new byte[fileLength];
            file.InputStream.Read(content, 0, fileLength);
            string fullPath = RootDirectory  "\"  name;

            FileStream fileStream = new FileStream(fullPath, FileMode.OpenOrCreate);
            fileStream.Write(content, 0, content.Length);
            fileStream.Flush();
            fileStream.Close();
            return string.Empty;
        }

        public override DirectoryItem ResolveDirectory(string path)
        {
            DirectoryItem[] directories = new DirectoryItem[0];
            FileItem[] files = this.GetFiles(RootDirectory);
            DirectoryItem dir = new DirectoryItem("Images", string.Empty, RootDirectory, string.Empty, fullPermissions, files, directories);
            return dir;
        }

        public override DirectoryItem ResolveRootDirectoryAsTree(string path)
        {
            //we don't have any subdirectories - everythinng is in the same folder
            DirectoryItem[] directories = new DirectoryItem[0];
            FileItem[] files = this.GetFiles(RootDirectory);
            DirectoryItem root = new DirectoryItem("Images", string.Empty, "Images\", string.Empty, fullPermissions, files, directories);
            return root;
        }

        public override bool CanCreateDirectory
        {
            get
            {
                return false;
            }
        }

        public override string CreateDirectory(string path, string name)
        {
            return null;
        }

        public override string StoreBitmap(Bitmap bitmap, string url, ImageFormat format)
        {
            return null;
        }

        public override Stream GetFile(string url)
        {
            return null;
        }

        public override string GetPath(string url)
        {
            return RootDirectory;
        }

        public override string GetFileName(string url)
        {
            return null;
        }

        [Obsolete]
        public override DirectoryItem[] ResolveRootDirectoryAsList(string path)
        {
            return null;
        }

        public override bool CheckWritePermissions(string folderPath) {
            return true;
        }
    }
  

Есть идеи, почему старая версия смогла вставить в поле, а новая версия — нет?

Комментарии:

1. Я проверил с помощью инструментов отладки браузера Chrome и IE, чтобы узнать, были ли какие-либо ошибки, но ничего не появляется. также не возникает ошибок на стороне сервера.

Ответ №1:

API FileBrowserProvider может быть изменен между старой и новой версиями. Вот почему я предлагаю изучить код следующей демонстрации http://demos .telerik.com/aspnet-ajax/editor/examples/dbfilebrowsercontentprovider/defaultcs.aspx это работает так, как ожидалось, и сравните его с кодом вашего пользовательского решения.

Если у вас есть какие-либо настраиваемые диалоговые окна, вам может потребоваться скопировать папку EditorDialogs из новой установки, которую вы используете, и настроить их с нуля.

С наилучшими пожеланиями, Рубец

Комментарии:

1. спасибо, я постараюсь использовать свои текущие библиотеки DLL и заменить их в этом проекте, и посмотрим, возникнет ли у меня такая же проблема

2. К сожалению, в примере в предоставленной ссылке не используется пользовательский поставщик контента, где, как и я. Есть еще идеи?

3. Он использует пользовательский поставщик контента, как указано в описании демонстрации: В этом примере демонстрируется реализация пользовательского FileBrowserContentProvider, использующего базу данных SQL в качестве источника файла. При автономной установке демонстрационных версий класс DBContentProvider доступен в папке App_Code Editor или в этой библиотеке кода: telerik.com/support/code-library/aspnet-ajax/file-explorer /.