我需要将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();
}
}
}
谢谢,桑迪普
您可以尝试从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。