Index: lams_common/src/java/org/lamsfoundation/lams/util/FileUtil.java =================================================================== diff -u -r58477cd191e3bc278b06ec3e012c196aedd788dc -r623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f --- lams_common/src/java/org/lamsfoundation/lams/util/FileUtil.java (.../FileUtil.java) (revision 58477cd191e3bc278b06ec3e012c196aedd788dc) +++ lams_common/src/java/org/lamsfoundation/lams/util/FileUtil.java (.../FileUtil.java) (revision 623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f) @@ -28,6 +28,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.net.URLEncoder; import java.nio.channels.FileChannel; import java.util.Date; @@ -528,4 +529,25 @@ } return 0; } + + /** + * Remove chars from a file name that may be invalid on a file system. + * @param name + * @return a filename that can be saved to a file system. + */ + public static String stripInvalidChars(String name) { + name = name.replaceAll("\\\\", ""); + name = name.replaceAll("\\/", ""); + name = name.replaceAll("\\:", ""); + name = name.replaceAll("\\*", ""); + name = name.replaceAll("\\?", ""); + name = name.replaceAll("\\>", ""); + name = name.replaceAll("\\<", ""); + name = name.replaceAll("\\|", ""); + name = name.replaceAll("\\#", ""); + name = name.replaceAll("\\%", ""); + name = name.replaceAll("\\$", ""); + name = name.replaceAll("\\;", ""); + return name; + } } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/export/ExportPortfolioConstants.java =================================================================== diff -u -re53268b2dfab47fefe05312674eb1533f03acf7f -r623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f --- lams_learning/src/java/org/lamsfoundation/lams/learning/export/ExportPortfolioConstants.java (.../ExportPortfolioConstants.java) (revision e53268b2dfab47fefe05312674eb1533f03acf7f) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/export/ExportPortfolioConstants.java (.../ExportPortfolioConstants.java) (revision 623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f) @@ -42,6 +42,7 @@ public static final String MAIN_NOTEBOOK_FILENAME = "notebook_main.html"; public static final String EXPORT_LEARNER_PREFIX = "Portfolio"; public static final String EXPORT_TEACHER_PREFIX = "Class Portfolio"; + public static final String EXPORT_TEMP_FILENAME = "export.zip"; public static final String HOST = getServerURL(); public static final String SUBDIRECTORY_BASENAME = "Activity"; //subdirectory for each activity is ActivityXX where XX is the activity Id public static final String SUBDIRECTORY_NOTEBOOK_BASENAME = "Notebook"; Index: lams_learning/src/java/org/lamsfoundation/lams/learning/export/service/ExportPortfolioService.java =================================================================== diff -u -re53268b2dfab47fefe05312674eb1533f03acf7f -r623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f --- lams_learning/src/java/org/lamsfoundation/lams/learning/export/service/ExportPortfolioService.java (.../ExportPortfolioService.java) (revision e53268b2dfab47fefe05312674eb1533f03acf7f) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/export/service/ExportPortfolioService.java (.../ExportPortfolioService.java) (revision 623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f) @@ -281,7 +281,8 @@ { throw new ExportPortfolioException("An error has occurred while zipping up the directory ", e); } - return zipfileName; + int index = dirToPutZip.lastIndexOf(File.separator); + return (index > -1 ? dirToPutZip.substring(index+1) : dirToPutZip); } /** @see org.lamsfoundation.lams.learning.export.service.IExportPortfolioService#doExport(Vector, Cookie[]) */ Index: lams_learning/src/java/org/lamsfoundation/lams/learning/export/service/IExportPortfolioService.java =================================================================== diff -u -r8bd9b88a431c50cf5b0f64a8e48a9d2ccc748fda -r623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f --- lams_learning/src/java/org/lamsfoundation/lams/learning/export/service/IExportPortfolioService.java (.../IExportPortfolioService.java) (revision 8bd9b88a431c50cf5b0f64a8e48a9d2ccc748fda) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/export/service/IExportPortfolioService.java (.../IExportPortfolioService.java) (revision 623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f) @@ -102,7 +102,7 @@ * * @param filename * @param directoryToZip - * @return + * @return name of directory containing zipped up portfolio. */ public String zipPortfolio(String filename, String directoryToZip); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/export/web/action/ExportDownloadServlet.java =================================================================== diff -u -r5df048f46a93d1767286c6bb25773ec3d19d1aa0 -r623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f --- lams_learning/src/java/org/lamsfoundation/lams/learning/export/web/action/ExportDownloadServlet.java (.../ExportDownloadServlet.java) (revision 5df048f46a93d1767286c6bb25773ec3d19d1aa0) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/export/web/action/ExportDownloadServlet.java (.../ExportDownloadServlet.java) (revision 623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f) @@ -98,9 +98,17 @@ private String constructAbsolutePath(String relativePath) { - return FileUtil.TEMP_DIR + File.separator + relativePath; + return FileUtil.TEMP_DIR + File.separator + + getDirname(relativePath) + File.separator + + ExportPortfolioConstants.EXPORT_TEMP_FILENAME; } + private String getDirname(String path) + { + int index = path.indexOf(File.separator); + return (index>0 ? path.substring(0, index) : path); + } + private String getFilename(String path) { int index = path.lastIndexOf(File.separator); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/export/web/action/MainExportServlet.java =================================================================== diff -u -r8373eb78b0931c5c0a21634563b759cab8299e7e -r623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f --- lams_learning/src/java/org/lamsfoundation/lams/learning/export/web/action/MainExportServlet.java (.../MainExportServlet.java) (revision 8373eb78b0931c5c0a21634563b759cab8299e7e) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/export/web/action/MainExportServlet.java (.../MainExportServlet.java) (revision 623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f) @@ -24,8 +24,10 @@ /* $$Id$$ */ package org.lamsfoundation.lams.learning.export.web.action; +import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.Cookie; @@ -129,7 +131,7 @@ if (portfolios!= null) { - + exportFilename = FileUtil.stripInvalidChars(exportFilename); exportTmpDir = portfolios.getExportTmpDir(); exportService.generateMainPage(request, portfolios, cookies); @@ -143,8 +145,8 @@ CSSBundler bundler = new CSSBundler(request, cookies, exportTmpDir, exportService.getUserThemes()); bundler.bundleStylesheet(); - // zip up the contents of the temp export folder - String zipFilename = exportService.zipPortfolio(exportFilename, exportTmpDir); + // zip up the contents of the temp export folder using a constant name + String exportZipDir = exportService.zipPortfolio(ExportPortfolioConstants.EXPORT_TEMP_FILENAME, exportTmpDir); /* -- Used for testing timeout change the export url in exportWaitingPage to -- String exportUrl = learning_root + "portfolioExport?" + request.getQueryString()+"&sleep=1800000"; -- to pause for 30 mins. @@ -158,23 +160,16 @@ } } */ - //return the relative filelocation of the zip file so that it can be picked up in exportWaitingPage.jsp + // return the relative (to server's temp dir) filelocation of the + // zip file so that it can be picked up in exportWaitingPage.jsp PrintWriter out = response.getWriter(); - out.println(returnRelativeExportTmpDir(zipFilename)); + out.println(URLEncoder.encode(exportZipDir + File.separator + exportFilename, "UTF-8")); } else { //redirect the request to another page. } } - - private String returnRelativeExportTmpDir(String absolutePath) - { - String tempSysDirName = FileUtil.TEMP_DIR; - return absolutePath.substring(tempSysDirName.length()+1, absolutePath.length()); - } - - }