`
jeasony
  • 浏览: 200690 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

内外网共享FCK editor的上传文件

阅读更多

问题: 
        后台系统通过FCKeditor上传图片或文件到文件系统中,会把相关的文件和图片信息转换为html脚本存放于数据库的LOB字段中,而图片或文件存放于磁盘系统中。假设外网有一个应用访问同一个数据库读取对应信息时,由于图片存储在后台应用的文件系统中,在网闸的限制下,前台的应用是无法访问后台的文件系统的。前台得不到图片,这样图片就无法显示了。

解决:
        在前台应用和后台文件系统间开放80端口的情况下,我们可以通过以下三种方式解决:
1)通过重写FCKeditor的SimpleUploaderServlet
重写的目的是为了将图片存储的相对路径改为添加IP地址的绝对路径访问,如:原文件存储路径为
/yourapp/UserFiles/Image/logo.gif
改为:
 http://202.0.0.7:8080/yourapp/UserFiles/Image/logo.gif 
即添加ip,这样在前端的应用可以通过80端口访问后台文件系统中的图片。
缺点是暴露了后台应用的IP地址,安全性较差。
 
2)通过Servletfilter来过滤URL,监听以/UserFiles/开头的路径,添加ip信息在前面,到达目的。出于安全性的考虑,这里需要两级的Servlet来过滤URL。后台发送到前台的URL需要添加IP信息以便访问图片资源,而前台应用与浏览器间需要通过一个filter来将IP信息过滤掉,从而不会将IP暴露。
 
3)将图片或文件以二进制形式写入数据库
    通过重写FCKeditor的SimpleUploaderServlet,将图片或文件以二进制形式写入数据库,在前台应用可以访问数据库的前提下,读取数据库,按照记录的URL,将图片或文件还原到前台的文件系统中。缺点是后台图片或文件更新时,前台需要全部还原更新。麻烦点儿的话,在写入数据库时,可以记录相对应的业务ID,前台还原时,只针对业务ID还原。

我这里采用了第三种方法解决问题,具体步骤如下:

架构:Hibernate 3.2 + Spring 1.2.8 + struts 1.2.8 + FCKeditor 2.3

3.1)创建对象
import java.sql.Blob;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import com.zhjy.frwk.domain.BaseNameObject;
/**
 * 存放上传附件及其描述信息
 * Accessory
 * 
@author Allen
 
*/

@SuppressWarnings(
"serial")
@Entity
@Table(name 
= "GEA_ACCESSORY")
public class Accessory extends BaseNameObject {
    
//id, name, desn this three attributes exist in super class
    
    String url; 
//附件相对路径
    
    @Column(name
="content")
    @Lob
    
protected Blob content; //附件实体
    
    @Temporal(TemporalType.DATE)
    
private java.util.Date createTime;
    
    
private String createBy;

    
// 省略set&get方法
    
}


3.2)重写SimpleUploaderServlet
    重写了SimpleUploaderServlet的doPost方法
@SuppressWarnings("deprecation""unchecked" })
    
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
if (debug) System.out.println("--- BEGIN DOPOST ---");
        
// 
        if(enabled) {
            
// upload to disk file
            
// 省略 使用原来的文件系统上传
            
// upload to database by zhengli 07.09.05
            Accessory accessory = new Accessory();
            accessory.setName(fileName);
            accessory.setDesn(
"this is a picture!");
            accessory.setUrl(fileUrl);
            accessory.setCreateBy(
"DefaultUser");
            accessory.setCreateTime(CommonDateUtils.getCalendar().getTime());
            Blob pic 
= null;
            FileInputStream in 
= null;
            
try {
                String fileLocation 
= currentDirPath + "\\" + fileName;
                in 
= new FileInputStream(fileLocation);
                pic 
= Hibernate.createBlob(in);
                accessory.setContent(pic);
                getAccessoryService().save(accessory);
                
            }
 catch (FileNotFoundException e) {
                _log.error(e.getMessage(), e);
            }
 catch (IOException e) {
                _log.error(e.getMessage(), e);
            }
 finally {
                in.close();
            }

        }

        
else {
            retVal
="1";
            errorMessage
="This file uploader is disabled. Please check the WEB-INF/web.xml file";
        }
        
        
//    
        if (debug) System.out.println("--- END DOPOST ---");           
}

3.3) 还原图片
        根据记录的URL建立目录结构并还原图片
 String accessoryPath  =  imageRootPath  +  accessory.getUrl();
File realFile 
 =   new  File(accessoryPath);
 if  ( ! realFile.exists())   //  当该文件不存在 
 
    realFile.mkdirs();  //  如果文件不存在则创建一个文件 
 
     try   {
        InputStream input 
 =  accessory.getContent().getBinaryStream();
        FileOutputStream output 
 =   new  FileOutputStream(accessoryPath);
        
 byte [] b  =   new   byte [ 1024   *   5 ];
        
 int  len;
        
 while  ((len  =  input.read(b))  !=   - 1  {
            output.write(b, 
 0 , len);
        }
 

        output.flush();
        output.close();
        input.close();
    }
 
  catch  (Exception e)  {
        e.printStackTrace();
        logger.error(
 " 保存文件出错! " );
    }
 
            
}

分享到:
评论

相关推荐

    fck文件上传模板

    这个“fck文件上传模板”显然与FCK编辑器的功能扩展有关,尤其是其文件上传功能。在Web开发中,文件上传是一个常见的需求,用于让用户上传图片、文档等各类文件到服务器。 FCK编辑器的文件上传功能通常涉及到以下几...

    Grails使用FCK Editor(附源码,有截图)

    最后,确保在Grails应用的配置文件中,允许静态资源的访问,以便FCK Editor的JavaScript文件能够正常加载: ```groovy grails.resources.mappings = { '/js/*' { resource(dir: 'js', includes: '*.js') } } ```...

    Grails使用FCK Editor实例(附源码和文档)

    - **处理文件上传**:如果需要支持图片或其他文件上传,你需要扩展FCK Editor的默认配置,创建一个Controller处理上传请求,并将上传文件保存在服务器上。 **4. 源码与文档** 提供的源码包含了一个完整的Grails项目...

    FCK Editor

    3. **图片上传**:FCK Editor 提供了内置的图片上传功能,允许用户直接在编辑器内上传图片并插入到文档中。 4. **HTML代码编辑**:对于有高级需求的用户,FCK Editor 还提供了源码视图,可以直接编辑HTML代码,满足...

    FCK editor 绝对完整

    2. **配置Web应用**:将FCKeditor的JavaScript文件和资源文件添加到Web应用的公共目录,如`/js`或`/lib`。 3. **在JSP页面中使用**:通过`<script>`标签引入FCKeditor的JavaScript文件,并创建编辑器实例。 4. **...

    fck editor

    7. **拖放功能**:用户可以通过拖放操作将本地文件上传到编辑器,简化了内容上传的过程。 8. **兼容性**:FCKeditor对各种浏览器的良好兼容性确保了在不同的浏览环境下,编辑的内容都能正常显示。 9. **安全**:...

    asp.NET 下配置好的fck 可以上传多媒体

    4. **多媒体上传支持**:FCKeditor支持多媒体文件上传,这涉及到服务器端的文件上传处理。要启用此功能,你需要配置编辑器的`config.FileBrowserUploadUrl`,指定一个处理文件上传的服务器端脚本,如ASP.NET的ASHX或...

    fck实现文件上传并自定文件名和按日期存放位置

    在IT行业中,文件上传功能是网站和应用程序中常见的需求之一,尤其在内容编辑器中,如FCKeditor。FCKeditor是一款开源的富文本编辑器,它提供了丰富的文本格式化功能,同时也支持用户上传图片和其他文件。在这个场景...

    FCK editor JAVA版使用说明

    博文链接:https://zyp731.iteye.com/blog/148264

    grails-fck-editor-0.3.zip_grails_grails-fck-editor

    从标签"grails grails-fck-editor"我们可以推断,这个压缩包包含了与Grails框架和FCKeditor插件相关的代码和配置文件。标签是用来分类和标识内容的关键字,这有助于开发者快速找到他们需要的信息。 压缩包内的文件...

    flex_fck_editor 例子

    1. 图片上传:Flex_FCK_Editor内置了图片上传功能,用户可以通过点击编辑器工具栏的“图片”按钮,选择本地图片并上传。开发者需要在服务器端设置接收图片的处理程序,并将返回的URL插入到编辑器中。 2. 插件开发:...

    FCK(fckeditor)远程图片上传功能

    在IT行业中,FCK(fckeditor)是一款非常知名的开源富文本编辑器,它为用户提供了方便的在线文本编辑体验。FCKeditor支持多种功能,其中包括我们关注的“远程图片上传”功能。这个特性允许用户直接从互联网上引用图片...

    FCK editor 使用实例代码

    你可以在`fckToolbarButtons.js`和`fck_config.js`中配置工具栏,或者通过`FCKeditorAPI`接口在运行时动态操作编辑器。 7. **图片上传与管理** FCKeditor提供了内置的图片上传功能,用户可以直接在编辑器中上传...

    FCK_Editor 和 FreeTextBox

    在.NET开发环境中,为了提升网页内容...对于压缩包中的FreeTextBox.rar和FCK_Editor.rar文件,解压后可以获取到这两款编辑器的源码和文档,通过学习和实践,开发者能够更好地掌握它们的使用方法,提升自己的开发技能。

    FCK集成图片批量上传

    **FCK编辑器集成图片批量上传详解** 在Web开发中,FCKeditor是一款非常流行的开源富文本编辑器,它允许用户在网页上编辑文本,并且支持插入图片、链接等多媒体元素。本文将深入探讨如何在.NET环境下,集成FCKeditor...

    FCk上传图片和文案

    这个名为"FCk上传图片和文案"的资源显然与使用FCKeditor在JSP(JavaServer Pages)环境中实现图片和文档上传的功能有关。下面我们将深入探讨这个主题。 FCKeditor是一个开源的JavaScript组件,它允许用户在网页上...

    MonoRail 上传文件 整合FCK

    在 MonoRail 中实现文件上传功能,特别是整合FCKeditor(一款富文本编辑器),可以极大地提升用户在网页上的编辑体验。 一、MonoRail上传文件 在MonoRail中处理文件上传,首先需要了解HTTP协议中的多部分/表单数据...

    FCK editor 2.5.1 例子 源代码

    9. **文件管理**:FCKeditor内置了文件管理器,允许用户上传、管理图片和其他文件,这些文件可以直接插入到编辑内容中。 10. **安全特性**:编辑器通过过滤和验证用户输入的HTML,防止XSS(跨站脚本攻击)和其他...

    fck编辑器使用手册

    FCK Editor 的功能丰富,支持图片上传、表格处理等多种高级特性,并且可以轻松地集成到 Web 应用程序中。 ### 安装与集成 #### 安装过程 1. **下载**:首先需要从官方网站下载 FCK Editor 的安装包。 2. **部署**...

    FCK FCKeditor_2.6.6 DLL 文件

    FCK FCKeditor_2.6.6 DLL 文件

Global site tag (gtag.js) - Google Analytics