读取AEM中DAM下存在的csv / .xlsx文件

问题描述 投票:0回答:1

我需要将ftp位置的csv / xlsx文件读取到AEM中,而无需下载它。我曾尝试使用inputstream和temp文件方法,但实现不成功。然后,我尝试将csv / xlsx文件上传到AEM中的DAM并尝试读取它,但是那也不起作用。任何指针或建议都将有所帮助。

package mercer.sites.core.servlets;

import java.io.File;

import java.io.IOException;
import java.io.InputStream;

import java.lang.reflect.InvocationTargetException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.dam.api.Asset;
import com.day.cq.dam.api.Rendition;

@Component(service = {
    Servlet.class
}, property = {
    "sling.servlet.methods=" + HttpConstants.METHOD_POST,
    "sling.servlet.paths=" + "/bin/server/ftpkiidsdownload"
})
public class FtpKIIDSDownload extends SlingAllMethodsServlet {

    private static final long serialVersionUID = -2936716575012279185 L;
    Logger log = LoggerFactory.getLogger(this.getClass());
    public static final String ftpUserName = "Anonymous";
    public static final String ftpPassword = "User@";
    public static final String ftpHost = "intranetftp.mercer.com";

    @Reference
    private ResourceResolverFactory resolverFactory;



    public void doPost(final SlingHttpServletRequest request, final SlingHttpServletResponse response) throws ServletException, IOException {
        log.info("hi");
        InputStream inputStream = null;
        String newFile = "";
        FTPClient ftpClient = null;
        String fileName = "2018-01-26-Us-Healthcare-Labor-Market-Analysis-Mockup-FINAL.pdf";
        String fileName2 = "footballersclub.xlsx";
        try {
            log.info("hi1");
            ftpClient = getFtpClient();

            inputStream = getdownloadFile("/public/riju/Sandeep/" + fileName2, ftpClient);

            newFile = writeToDam(fileName2, inputStream);
            readExcelFile(newFile);

            response.setStatus(SlingHttpServletResponse.SC_CREATED);
            response.getWriter().print("File uploaded correctly");
            log.info("hello");
        } catch (Exception e) {
            response.setStatus(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.sendError(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.getWriter().print("{\"status:\": \"An error occured on the server\"}");
        } finally {

            ftpClient.logout();
            ftpClient.disconnect();

        }
    }

    public FTPClient getFtpClient() throws SocketException, IOException, ServletException {
        FTPClient ftp = null;

        ftp = new FTPClient();
        ftp.connect(ftpHost);
        reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            throw new ServletException("Exception in connecting to FTP Server");
        }
        ftp.login(ftpUserName, ftpPassword);
        ftp.setFileType(FTP.BINARY_FILE_TYPE);
        ftp.enterLocalPassiveMode();
        log.info("hi2 inside FTPCLient");
        return ftp;
    }
    public InputStream getdownloadFile(String remoteFilePath, FTPClient ftp) throws IOException {
        InputStream is = null;
        try {

            is = ftp.retrieveFileStream(remoteFilePath);
            if (is == null) {
                log.info("null");
                return null;
            }

            log.info("hi3 inside getDownloadfile");
            return is;
        } catch (IOException e) {

            e.printStackTrace();
        }

        return null;
    }
    public String writeToDam(String fileName, InputStream is) {
        String newFile = "";
        log.info("hi4 inside write to dam");
        log.info(fileName);
        Map < String, Object > param = new HashMap < String, Object > ();
        param.put(ResourceResolverFactory.SUBSERVICE, "mercerReadService");
        ResourceResolver resolver = null;
        log.info("hi5 inside write but below rs");
        try {
            log.info("inside writetoDam try loop");
            resolver = resolverFactory.getServiceResourceResolver(param);
            log.info("hi6 inside write but below in try loop");
            com.day.cq.dam.api.AssetManager assetMgr = resolver.adaptTo(com.day.cq.dam.api.AssetManager.class);
            log.info("hi7 inside write but below asset manager");
            if (fileName.endsWith(".pdf")) {
                newFile = "/content/dam/" + fileName;
                log.info("hi8 inside write but below asset manager under new file");
                assetMgr.createAsset(newFile, is, "application/pdf", true);
                log.info(newFile);
            } else if (fileName.endsWith(".xlsx")) {
                fileName = fileName.split("\\.")[0];
                newFile = "/content/dam/temp/" + fileName;
                log.info("hi8 inside write but below asset manager under new file");
                assetMgr.createAsset(newFile, is, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", true);
                log.info(newFile);
            }
            return newFile;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
    public void readExcelFile(String fileName) throws SocketException, IOException, ServletException, InvocationTargetException {
        XSSFWorkbook workbook = null;
        XSSFSheet sheet = null;
        try {
            Map < String, Object > param = new HashMap < String, Object > ();
            param.put(ResourceResolverFactory.SUBSERVICE, "mercerReadService");
            ResourceResolver resolver = null;
            resolver = resolverFactory.getServiceResourceResolver(param);
            org.apache.sling.api.resource.Resource resource = resolver.getResource(fileName);
            Asset asset = resource.adaptTo(Asset.class);
            Rendition rend = asset.getOriginal();
            File file = rend.adaptTo(File.class);
            workbook = new XSSFWorkbook(file);
            sheet = workbook.getSheetAt(0);
            Iterator < Row > rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                Iterator < Cell > cellIterator = row.cellIterator();
                while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();
                    switch (cell.getCellType()) {
                        case Cell.CELL_TYPE_NUMERIC:
                            log.info(cell.getNumericCellValue() + "t");
                            break;
                        case Cell.CELL_TYPE_STRING:
                            log.info(cell.getStringCellValue() + "t");
                            break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            workbook.close();
        }

    }
}

谢谢,桑迪普

java aem ftp-client
1个回答
0
投票

您可以尝试从AEM Dam获取任何文件。

    ResourceResolver resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null);
    Resource res = resourceResolver.getResource("/path/to/dam/file);
    Asset asset = res.adaptTo(Asset.class);
    Rendition rendition = asset.getOriginal();
    InputStream inputStream = rendition.adaptTo(InputStream.class);
    String inputString = CharStreams.toString(reader);

我在上面给出的最后一行中已转换为String。但是,在获得InputStream之后,您可以执行所需的任何操作。也许使用一些API从中获取CSV。

© www.soinside.com 2019 - 2024. All rights reserved.