【问题标题】:WebScript for uploading files: during the first upload one extra version created用于上传文件的 WebScript:在第一次上传期间创建了一个额外的版本
【发布时间】:2018-07-20 06:00:17
【问题描述】:

要将文件上传到存储库,我使用以下 Java 支持的 WebScript:

public class CustomFileUploader extends DeclarativeWebScript {
    private static final String FIRM_DOC = "{http://www.firm.com/model/content/1.0}doc";
    private static final String FIRM_DOC_FOLDER = "workspace://SpacesStore/8caf07c3-6aa9-4a41-bd63-404cb3e3ef0f";

    private FileFolderService fileFolderService;
    private ContentService contentService;
    private NodeService nodeService;
    private SearchService searchService;

    protected Map<String, Object> executeImpl(WebScriptRequest req, Status status) {
        processUpload(req);
        return null;
    }

    private void writeContent(NodeRef node, FirmFile firmFile) {
        try {
            ContentWriter contentWriter = contentService.getWriter(node, ContentModel.PROP_CONTENT, true);
            contentWriter.setMimetype(firmFile.getFileMimetype());
            contentWriter.putContent(firmFile.getFileContent().getInputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private NodeRef checkIfNodeExists(String fileName) {
        StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");
        ResultSet resultSet = searchService.query(storeRef, SearchService.LANGUAGE_LUCENE/*LANGUAGE_FTS_ALFRESCO*/, 
                "TYPE:\"firm:doc\" AND @cm\\:name:" + fileName.replaceAll(" ", "\\ ")+ "");

        int len = resultSet.length();
        if(len == 0) { 
            return null;
        }

        NodeRef node = resultSet.getNodeRef(0);
        return node;
    }

    private NodeRef createNewNode(FirmFile firmFile) {
        NodeRef parent = new NodeRef(FIRM_DOC_FOLDER);
        NodeRef node = createFileNode(parent, firmFile.getFileName());

        return node;
    }

    private void processUpload(WebScriptRequest req) {
        FormData formData = (FormData) req.parseContent();
        FormData.FormField[] fields = formData.getFields();

        for(FormData.FormField field : fields) {
            String fieldName = field.getName();
            if(fieldName.equalsIgnoreCase("firm_file") && field.getIsFile()) {
                String fileName = field.getFilename();
                Content fileContent = field.getContent();
                String fileMimetype = field.getMimetype();

                NodeRef node = checkIfNodeExists(fileName);

                // POJO
                FirmFile firm = new FirmFile(fileName, fileContent, fileMimetype, FIRM_DOC);
                if(node == null) {
                    node = createNewNode(firmFile);
                } 

                writeContent(node, firmFile);
            }
        }
    }

    private NodeRef createFileNode(NodeRef parentNode, String fileName) {
        try {
            QName contentQName = QName.createQName(FIRM_DOC);
            FileInfo fileInfo = fileFolderService.create(parentNode, fileName, contentQName);
            return fileInfo.getNodeRef();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public FileFolderService getFileFolderService() {
        return fileFolderService;
    }

    public void setFileFolderService(FileFolderService fileFolderService) {
        this.fileFolderService = fileFolderService;
    }

    public ContentService getContentService() {
        return contentService;
    }

    public void setContentService(ContentService contentService) {
        this.contentService = contentService;
    }

    public NodeService getNodeService() {
        return nodeService;
    }

    public void setNodeService(NodeService nodeService) {
        this.nodeService = nodeService;
    }

    public SearchService getSearchService() {
        return searchService;
    }

    public void setSearchService(SearchService searchService) {
        this.searchService = searchService;
    }
}

此 WebScript 有效。

有一个问题:如果上传的文件在存储库中不存在,则同时创建两个版本:1.01.1。版本1.0 的大小为0 字节并且没有内容。

我认为版本1.0是在这里创建的:

FileInfo fileInfo = fileFolderService.create(parentNode, fileName, contentQName); 

版本1.1,或许是在这里创建的,写内容的时候:

ContentWriter contentWriter = contentService.getWriter(node, ContentModel.PROP_CONTENT, true);
contentWriter.setMimetype(firmFile.getFileMimetype());
contentWriter.putContent(firmFile.getFileContent().getInputStream());

如何防止创建“空”版本1.0

【问题讨论】:

    标签: java file-upload alfresco versioning alfresco-webscripts


    【解决方案1】:

    Axel Faust 对这个问题here 给出了很好的回答。

    问题出在fileuploader.post.desc.xml 描述符中,我没有设置运行网络脚本所需的transaction level

    <transaction>none</transaction>
    

    因此,writeContent()createFileNode() 方法默认是事务性的,并且每个方法都创建了自己的内容版本。

    我设置了以下内容:

    <transaction>requiresnew</transaction>
    

    问题解决了。谢谢@Axel Faust

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多