0

当我尝试使用ice:outputResource从服务器(Liferay jsf2.0)下载文件时,我遇到了一些奇怪的问题。

使用相同的代码、页面和文件,但 outputresource 将抛出错误代码 500,直到我重建我的项目,重建后我的文件可以下载。

我的场景是(我确定路径和文件存在):

用户上传文件 A(将文件存储在临时文件中)- 下载正常

用户保存操作(将文件移动到资源文件夹)

用户编辑表单(从资源文件夹重新加载文件 A)- 下载失败(抛出错误 500)

重建代码,然后上传另一个文件B(与A相同)

用户编辑表单(重新加载 A 和 B) - 下载 A 正常但下载 B 失败

我将资源初始化代码放在(Hibernate)模型中以避免循环:

@Transient
    private Resource ksf_resource;

    public Resource getKsf_resource() {
        if(ksf_resource == null){
            try{                    
                ksf_resource = new CCHCResource("/"+path + "/" , ksf_realname);
                _log.info("path {}, file {}", path, ksf_realname);
                }

            }catch(Exception ex){
                //file not found or server error
                _log.warn("File not found!");
                ksf_resource = null;
            }
        }
        return ksf_resource;
    }

资源代码

public class CCHCResource implements Resource, Serializable {

    private static final long serialVersionUID = -639586497927876085L;


    private String path;
    private String resourceName;
    private InputStream inputStream;
    private final Date lastModified;

    public CCHCResource(String path, String resourceName) {
        this.path = path;
        this.resourceName = resourceName;
        this.lastModified= new Date();
    }

    @Override
    public InputStream open() throws IOException {
        InputStream stream = FacesContext.getCurrentInstance()
                .getExternalContext().getResourceAsStream(path + resourceName);
//      System.out.println("get resource: " + path + resourceName);
        byte[] byteArray = toByteArray(stream);
        inputStream = new ByteArrayInputStream(byteArray);
        return inputStream;
    }

    public static byte[] toByteArray(InputStream input) throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] buf = new byte[4096];
        int len = 0;
        while ((len = input.read(buf)) > -1) output.write(buf, 0, len);
        return output.toByteArray();
    }

    @Override
    public String calculateDigest() {
       return resourceName;
    }

    @Override
    public void withOptions(Options arg0) throws IOException {
    }

    @Override
    public Date lastModified() {
        return lastModified;
    }
}

xhtml

<ice:outputResource
    image="#{resource['images:isoDownload']}"       
    resource="#{file.ksf_resource}"
    attachment="true"
    fileName="#{file.ksf_displayname}"
    type="application/text"
    label="#{itemtp.ksf_displayname}"/>
4

1 回答 1

0

不知道为什么,但是添加属性shared="false"可以解决这个错误

<ice:outputResource
    image="#{resource['images:isoDownload']}"       
    resource="#{file.ksf_resource}"
    attachment="true"
    fileName="#{file.ksf_displayname}"
    type="application/text"
    label="#{itemtp.ksf_displayname}"
shared="false"/>
于 2013-12-03T00:43:35.507 回答