计算图像资源的URL

时间:2014-02-13 09:39:07

标签: xpages xpages-ssjs

在绑定到domDoc数据源的xpage中,我想为存储在数据源的richtext字段中的图像构建预览机制。 Designer和服务器是V 9.0.1。

附加图像的名称作为数组存储在viewScope var中,并作为源提供给重复控件。图像控件位于重复内部。我还在图像旁边放置了一个链接控件,提供了下载文件的方法。计算出的网址如下所示:

/dbpath/dbfile.nsf/xsp/.ibmmodres/domino/OpenAttachment/dbpath/dbfile.nsf/docunid/rtBodyField/filename.gif

链接的计算工作完美,但图像永远不会显示。相反,Firebug告诉我图像的源URL无法解析。事实上,我发现数据库路径部分已经在网址的/xsp/.ibmmodres/domino/OpenAttachment/部分之前呈现了两次(但之后只有一次!):

/dbpath/dbfile.nsf/dbpath/dbfile.nsf/xsp/.ibmmodres/domino/OpenAttachment/dbpath/dbfile.nsf/docunid/rtBodyField/filename.gif

这是我用来计算链接(使用其value属性)和图像(使用其url属性)的源URL的代码:

var unid=context.getUrlParameter('documentId');
var p=facesContext.getExternalContext().getRequestContextPath();
return p+'/xsp/.ibmmodres/domino/OpenAttachment'+p+'/'+unid + '/rtBodyFld/'+imgEntry;

这是我迄今为止尝试解决这个奇迹的原因:

a)在PageLoad之前计算数据库路径(facesContext...),将其存储在viewScope中,然后在构建图像的源时引用viewScope ==>与上述结果相同

b)使用图像的属性而不是 url ==>与上述结果相同

c)使用标准的html <img />标记,其中src参数使用"#{javascript:...}"构建,其代码与上述相同==&gt;这很好用!

所以我确实有解决方案c)的解决方法,但我仍然想知道为什么路径元素在网址的第一部分中只加倍 ,而仅< / em>用于图像资源。

修改
尝试了两件事:
d)将图像控件拉到我的重复之外,然后将固定(和有效)的文件名添加到计算的url ==&gt;与上述相同(差)的结果

e)仅计算整个网址部分,除了图像文件名之前的PageLoad并存储在viewScope var ==&gt;中。这是最奇怪的结果:在图像外面,viewcope包含正确的路径信息,但在内部我看到的结果与上面相同。因此,在图像内部,viewScope变量似乎在部分???

中被改变

这太奇怪了,我觉得我一定在这里犯了一个非常简单和愚蠢的错误,但那会是什么呢?

2 个答案:

答案 0 :(得分:1)

您在寻找calculate attachment URLs的方式吗?试试这个:

function getAttachmentURL(docID:java.lang.String, attachmentName:java.lang.String) {
    var base = getBaseURL();
    var middle = "/xsp/.ibmmodres/domino/OpenAttachment";
    if (base.substr(0,4) == "/xsp") {
        middle += base.substr(4);
    } else {
        middle += base;
    }
    var result = base + middle + "/" + docID + "/$File/" + attachmentName + "?Open";
    return result;
}

function getBaseURL() {
    var curURL = context.getUrl();
    var curAdr = curURL.getAddress();
    var rel = curURL.getSiteRelativeAddress(context);
    var step1 = curAdr.substr(0,curAdr.indexOf(rel));

    // Now cut off the http
    var step2 = step1.substr(step1.indexOf("//")+2);
    var result = step2.substr(step2.indexOf("/"));
    return result;   
   }

希望有所帮助!

答案 1 :(得分:0)

好吧,就像我担心的那样:我没有考虑到为图像控件定义的相对网址自动带有/dbpath/dbfile.nsf/前缀

这就是为什么无论我如何计算自己的网址,该部分总是出现两次。如果我使用绝对网址http://server/path/dbfile.nsf/...

,它会有效

因此,计算的网址必须像这样构建:

var unid=context.getUrlParameter('documentId');
var p=facesContext.getExternalContext().getRequestContextPath();
return '/xsp/.ibmmodres/domino/OpenAttachment' + p + '/' + 
         unid + '/rtBodyFld/' + imgEntry;