`

chx 学习jForum笔记十六 实现附件移植,添加附件时按钮无效的问题解决

阅读更多

==背景==

 

原论坛附件存放于d:\res\cibforum\500整\id\

 

====修改程序使之符合原规范====

修改\view\forum\common\AttachmentCommon.java中的makeStoreFilename(AttachmentInfo attInfo)

private String makeStoreFilename(AttachmentInfo attInfo)
 {
 Calendar cal = new GregorianCalendar();
 cal.setTimeInMillis(System.currentTimeMillis());
 cal.get(Calendar.YEAR); int year = Calendar.getInstance().get(Calendar.YEAR);
 int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
 int day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
 StringBuffer dir = new StringBuffer(256);
 dir.append(year).append('/').append(month).append('/').append(day).append('/');
 

改为

private String makeStoreFilename(AttachmentInfo attInfo,int postid)
 {
 StringBuffer dir = new StringBuffer(256);
 int id500 = postid-(postid%500)+500;
 dir.append(id500).append('/').append(postid).append('/');

 从上面的情况可以看出,原先JFORUM将附件存放于年/月/日/目录下,现修改为与POST的ID相关的目录下。

 

 return dir.append(MD5.crypt(attInfo.getRealFilename() + System.currentTimeMillis()))
 .append('_').append(SessionFacade.getUserSession().getUserId()).append('.')
 .append(attInfo.getExtension().getExtension()).append('_').toString();
 


改为

 return dir.append(attInfo.getRealFilename()).append('_')
 .append(SessionFacade.getUserSession().getUserId()).append('.')
 .append(attInfo.getExtension().getExtension())    .append('_').toString();

 从上面的情况可以看出,原先JFORUM将附件名为对文件名及当前时间进行MD5加密后生成的字符串加用户ID,现修改为真实文件名加用户ID。



向public void insertAttachments(final Post post)中增加

 AttachmentInfo info = attachment.getInfo();
 String savePath = this.makeStoreFilename(info,attachment.getPostId());
 if (!info.getPhysicalFilename().equals(savePath)){
   info.setPhysicalFilename(savePath);
 }

为了改变info的实际保存地址,在预处理时,postid=0,需在此进行调整

将public void preProcess()中的

 String savePath = this.makeStoreFilename(info);

 

改为

String savePath = this.makeStoreFilename(info,userId);
 


对SystemGlobals.properties进行设置

attachments.store.dir = d:/res/cibforum
 

 

====添加附件时按钮无效的问题解决====

进入发帖的界面时,IE会报“网页有错误”

在发布帖子的时候,发现点击“附件”按钮没有效果。

这个问题也查了两天的时间,后来同事高手感觉是jquery没运行。看源码才发现jquery指向了外网,所以内网上会有问题。

看程序的源文件,其中带有jquery,指向程序源文件中的位置问题即可解决。
查找原文件中的所有"jquery"字样的语句。
将其中的
 src="http://code.jquery.com/jquery-1.4.2.min.js"
改为
 src="${contextPath}/javascript/jquery-1.4.2.min.js"

====建立原论坛的附件库====

由于原论坛的帖子已经全部导入了新库,但jforum对附件有相应的表需要新增记录。以下就在管理界面中增加一个同步按钮,用于对原论坛的贴子进行分析,有附件的就查一下物理磁盘上是否有相应文件,如果有的话,就向jforum的附件表中新增相应的记录。


1、修改attachments_config.htm文件,在
 <input type="submit" value="${I18n.getMessage("Update")}" class="mainoption" />&nbsp;&nbsp;
前添加语句

 <input class="mainoption" type="button" value="trans files" name="button"
  onclick="document.location = '${JForumContext.encodeURL("/${moduleName}/transfiles")}';" />&nbsp;&nbsp;

用于在管理界面中的“附件”中增加一个按钮。



2、在urlPattern.properties文件中,添加

 adminAttachments.transfiles.0 =

 这次吸取前次教训,向urlPattern.properties文件中注册一个action。



3、在generic_queries.sql中增加

 PostModel.getMaxId = SELECT MAX(post_id) FROM jforum_posts;

 取得所有POST的最大ID号,用于循环条件。



4、在AttachmentsAction.java中增加

    public void transfiles(){
        Post post ;
        StringBuffer resulttext;
        int codeIndex;
        int codeEndIndex;
        int nextStartPos;
        int maxId=0;
        String nonCodeResult;
        String codeResult;
        PostDAO pm = DataAccessDriver.getInstance().newPostDAO();
        PreparedStatement p = null;
        ResultSet rs = null;
        try {
            p = JForumExecutionContext.getConnection()
                .prepareStatement(SystemGlobals.getSql("PostModel.getMaxId"));
            rs = p.executeQuery();
            if (rs.next()){
               //取最大ID号
               maxId = rs.getInt(1);
            }
        } catch (SQLException e) {
                throw new DatabaseException(e);
            }
            finally {
                DbUtils.close(rs, p);
            }         
        for (int postId=0; postId < maxId ; postId++){
            //取POST
            post =  pm.selectById(postId);
            if (post.getId()>0){
                //分析POST中的内容
                codeIndex = post.getText().indexOf("[link=");
                codeEndIndex = codeIndex > -1 ? post.getText().indexOf("[/link]") : -1;
                if (codeIndex > -1 && codeEndIndex > -1 && codeEndIndex > codeIndex) {
                    nextStartPos = 0; //起始位置
                    resulttext = new StringBuffer(post.getText().length()); //替换成新内容
                    while (codeIndex > -1 && codeEndIndex > -1 && codeEndIndex > codeIndex) {
                        codeEndIndex += "[/link]".length(); //结束位置
                        nonCodeResult = post.getText().substring(nextStartPos, codeIndex); //非附件内容
                        //附件处理
                        codeResult = ChxNew_parseCode(post.getText().substring(codeIndex, codeEndIndex),post);
                        System.out.println(codeResult); //附件内容替换
                        resulttext.append(nonCodeResult).append(codeResult);
                        nextStartPos = codeEndIndex;
                        codeIndex = post.getText().indexOf("[link=", codeEndIndex);
                        codeEndIndex = codeIndex > -1 ? post.getText().indexOf("[/link]", codeIndex) : -1;
                    }
                    if (nextStartPos > -1) {   //尾部处理
                        nonCodeResult = post.getText().substring(nextStartPos);
                        resulttext.append(nonCodeResult);
                    }
                    post.setText(resulttext.toString());
                    post.hasAttachments(true);
                    pm.update(post);//保存post中的文本
                }
            }
        }
        this.list();//返回原界面
    }

 以上内容为取每条POST,并分析其中的内容。将类似于[link=xxxx.xxx]xxxx[/link]的字符串交给下面的子函数处理。并用返回内容替换原有内容。

 

  /*
    分析link中的内容,
    向附件表添加相应的记录
     */
    private static String ChxNew_parseCode(final String text,final Post post)
    {
        //text 应为类似于 [link=xxx.xls]xxxx[/link]的字符串
        int index = text.indexOf("[link=");
        int index2 = text.indexOf("]");
        int lastIndex = text.indexOf("[/link]", index2);
        if (index > -1 && index2 > index && lastIndex > index2) {
           String filename = text.substring(index+"[link=".length(),index2);
           String description = text.substring(index2+1,lastIndex);
           if (AttachmentCommon.insertAttachment(filename,description,post))
               return "〔附件:"+description+"〕";
        }
        return text;
    }

以上内容就是分析字符串,获取文件名及文件描述,交给下面的子函数进行处理,如果处理成功就返回一个替换原内容的字符串,如果失败则返回原字符串(即不替换原有内容)。

 

4.在AttachmentCommon.java中增加

    static public boolean insertAttachment(final String filename,final String description,final Post post){
        final int postid = post.getId();
        final int id500 = postid-(postid%500)+500;
        final String PhysicalFilename=SystemGlobals.getValue(ConfigKeys.ATTACHMENTS_STORE_DIR) + "/" + id500 + "/"+postid+"/"+filename;
        final File file = new File(PhysicalFilename);
        if (file.exists()){//判断文件是否存在于磁盘上。
            try{
            final int userId = post.getUserId();
            Attachment attachment = new Attachment();
            attachment.setUserId(userId);
            attachment.setPostId(postid);
            AttachmentInfo info = new AttachmentInfo();
            info.setFilesize(file.length());
            info.setComment(description);
            info.setMimetype(new MimetypesFileTypeMap().getContentType(file));
            info.setRealFilename(filename);
            info.setUploadTimeInMillis(post.getTime().getTime());
            String extension = filename.substring(filename.lastIndexOf('.') + 1);
            AttachmentDAO attachmentDao=DataAccessDriver.getInstance().newAttachmentDAO();
            AttachmentExtension ext = attachmentDao.selectExtension(extension.toLowerCase());
            if (ext.isUnknown()) {
                ext.setExtension(extension);
            }
            info.setExtension(ext);
            info.setPhysicalFilename(PhysicalFilename);
            attachment.setInfo(info);
            attachmentDao.addAttachment(attachment);//调用程序原生的添加附件功能。
            return true;
            }
            catch (Exception e){
                System.out.println("error!"+e);
                return false;
            }
        }
        else {
            return false;
        }
    }

 以上是根据参数判断文件是否存在,如果存在则生成相应记录加入附件表及附件信息表。

 

分享到:
评论

相关推荐

    chx 学习jForum笔记十八 jForum与ms sqlserver

    《jForum与MS SQLServer整合学习笔记》 jForum是一款基于Java的开源论坛系统,它以其高度可定制性、灵活性和强大的功能深受开发者喜爱。在本文中,我们将深入探讨如何将jForum与Microsoft SQL Server(简称MS SQL...

    chx99个人主页源码_chx99.zip

    【标题】"chx99个人主页源码_chx99.zip" 提供的是一个名为 chx99 的个人主页的源代码。源码通常包含了网站设计、布局、功能实现等核心部分,对于开发者而言是了解网站工作原理、学习前端技术或者进行二次开发的重要...

    CHX TNF JNK之间的关系

    标题与描述中的关键词“CHX TNF JNK”揭示了在细胞凋亡机制中的相互作用,尤其是关于人类肝癌细胞对肿瘤坏死因子α(TNFα)诱导的凋亡反应。这一研究聚焦于理解CHX(环己亚胺)、TNFα以及JNK(c-Jun N端激酶)三者...

    chx2095中文 英文资料

    根据给定的文件信息,我们可以提炼出以下关于CHX2095的详细IT知识: ### CHX2095概述 **CHX2095**是一款由United Monolithic Semiconductors S.A.S.制造的频率倍增器集成电路(IC),其工作频率范围在7.5至30GHz...

    CHX

    此外,对于初学者来说,阅读和理解CHX的源代码也是一个很好的学习C语言和理解十六进制编辑器工作原理的机会。 总的来说,CHX 是一款实用的终端工具,它的轻量级设计和高度可定制性使其成为开发人员和系统管理员的...

    [CMS程序]chx99个人主页源码_chx99(ASP.NET源码).rar

    【CMS程序】Chx99个人主页源码是基于ASP.NET技术开发的一款网站内容管理系统,主要面向个人用户,用于快速构建个性化主页。ASP.NET是由微软公司推出的服务器端Web应用程序框架,它提供了丰富的功能和高性能,使得...

    CHX-I防火墙官方教程-附带翻译终稿.pdf

    CHX-I防火墙官方教程-附带翻译终稿.pdf

    Chx.rar_最优化_最优化方法_梯度优化_梯度法

    这表明压缩包里的资源可能涉及如何使用梯度信息来优化复杂问题的解决方案。 首先,我们要理解“最优化”是什么。最优化是指在给定的约束条件下,寻找一个函数的最大值或最小值。这在很多实际问题中都有应用,如机器...

    CHX612.zip

    这篇文章将详细讲解与"CHX612.zip"压缩包相关的知识点,主要涉及HX612触摸IC、STC15W408AS微控制器以及相关编程与接口技术。 首先,我们关注的是HX612,这是一款触摸传感器集成电路。不同于常见的I2C接口,HX612...

    HA-SoftEther-CHX虚拟专网

    HA-SoftEther-CHX虚拟专网HA-SoftEther-CHX虚拟专网HA-SoftEther-CHX虚拟专网HA-SoftEther-CHX虚拟专网

    chx99个人主页源码

    【标题】"chx99个人主页源码"是一个针对个人使用的网站源代码,它提供了构建个人在线展示空间的基础框架。个人主页源码通常包含了HTML、CSS、JavaScript等前端技术,有时也会涉及到PHP、Node.js等后端语言,用于实现...

    \HA-SoftEther-CHX虚拟网卡及教程

    本软件是一个模似网卡和集线器的工具,可以模似集线器功能,实现VPN的功能。使得系统把此软件识别成一块网卡,有了这个东西,只要可以访问外网,都可以连接到虚拟HUB上与其他电脑组成局域网,在此虚拟的局域...

    ASP.NET源码——[CMS程序]chx99个人主页源码.zip

    总的来说,"ASP.NET源码——[CMS程序]chx99个人主页源码.zip"是一个宝贵的学习资源,不仅展示了ASP.NET在实际项目中的应用,也提供了实践和理解Web开发最佳实践的机会。无论是初学者还是经验丰富的开发者,都能从中...

    CHX Hyper eXpressor-开源

    开源社区的贡献者可能会添加新的功能、修复问题或者改进性能,使得CHX成为一个更强大、更适应需求的工具。 在提供的压缩包`chx-0.0.2`中,我们可以期待找到以下内容: 1. **源代码**:CHX转换器的实现,可能包含...

    北大计算机系高级计算机系统结构课件chx14-arch03-ilp1

    5. **延迟回写(Delay Writeback)**:这是一种策略,通过确保所有指令到达写回(WB)阶段都有相同的延迟,以解决流水线中的延迟问题。 6. **旁路(Bypassing)**:为了避免回写延迟导致单周期整数操作变慢,处理器...

    北大计算机系高级计算机系统结构课件chx14-arch08-mm1

    【北京大学计算机科学高级计算机系统结构课件chx14-arch08-mm1】主要探讨了计算机系统中的主存,特别是动态随机存取内存(DRAM)的延迟问题以及解决策略。这一讲义由北京大学计算机科学技术系和微处理器研究开发中心...

    ASP.NET-[CMS程序]chx99个人主页源码.zip

    对于个人主页而言,一个优秀的CMS能够帮助用户轻松地更新网页内容、添加博客文章、管理用户评论以及自定义网站布局等。 在"chx99个人主页源码"中,我们可以期待看到以下几个关键部分: 1. **数据库设计**:源码...

    CHX-3大手臂大法兰.SLDDRW

    CHX-3大手臂大法兰.SLDDRW

    [CMS程序]chx99个人主页源码_chx99.zip源码ASP.NET网站源码打包下载

    [CMS程序]chx99个人主页源码_chx99.zip源码ASP.NET网站源码打包下载[CMS程序]chx99个人主页源码_chx99.zip源码ASP.NET网站源码打包下载[CMS程序]chx99个人主页源码_chx99.zip源码ASP.NET网站源码打包下载[CMS程序]...

Global site tag (gtag.js) - Google Analytics