Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/ExportToolContentAction.java =================================================================== diff -u -r0c23948713b5a36c2bfd46ce763ab3653c33a308 -r9a123141df4cdf18fefb239b7d4c50e9d488d42d --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/ExportToolContentAction.java (.../ExportToolContentAction.java) (revision 0c23948713b5a36c2bfd46ce763ab3653c33a308) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/ExportToolContentAction.java (.../ExportToolContentAction.java) (revision 9a123141df4cdf18fefb239b7d4c50e9d488d42d) @@ -31,11 +31,9 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.List; -import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.mail.internet.MimeUtility; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -117,32 +115,7 @@ //write zip file as response stream. // Different browsers handle stream downloads differently LDEV-1243 - String agent = request.getHeader("USER-AGENT"); - - log.debug("Browser is:" + agent); - - String filename = null; - - - - if (null != agent && -1 != agent.indexOf("MSIE")) - { - // if MSIE then urlencode it - filename = URLEncoder.encode(zipfile, "UTF-8"); - - } - else if (null != agent && -1 != agent.indexOf("Mozilla")) - { - // if Mozilla then base64 url_safe encoding - filename = MimeUtility.encodeText(zipfile, "UTF-8", "B"); - - } - else - { - // any others use same filename. - filename = zipfile; - - } + String filename = FileUtil.encodeFilenameForDownload(request, zipfile); log.debug("Final filename to export: " + filename); response.setContentType("application/x-download"); Index: lams_common/src/java/org/lamsfoundation/lams/util/FileUtil.java =================================================================== diff -u -r623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f -r9a123141df4cdf18fefb239b7d4c50e9d488d42d --- lams_common/src/java/org/lamsfoundation/lams/util/FileUtil.java (.../FileUtil.java) (revision 623a8b69a67eb91d7e0a31c5f4d15c4fabb9aa6f) +++ lams_common/src/java/org/lamsfoundation/lams/util/FileUtil.java (.../FileUtil.java) (revision 9a123141df4cdf18fefb239b7d4c50e9d488d42d) @@ -28,13 +28,17 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.channels.FileChannel; import java.util.Date; +import javax.servlet.http.HttpServletRequest; + import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.lamsfoundation.lams.util.zipfile.ZipFileUtilException; +import javax.mail.internet.MimeUtility; /** * General File Utilities @@ -550,4 +554,37 @@ name = name.replaceAll("\\;", ""); return name; } + + /** Encode a filename in such a way that the UTF-8 characters won't be munged during the download by a browser. Need the + * request to work out the user's browser type + * @return encoded filename + * @throws UnsupportedEncodingException + */ + public static String encodeFilenameForDownload(HttpServletRequest request, String unEncodedFilename) throws UnsupportedEncodingException { + + // Different browsers handle stream downloads differently LDEV-1243 + String agent = request.getHeader("USER-AGENT"); + String filename = null; + + if (null != agent && -1 != agent.indexOf("MSIE")) + { + // if MSIE then urlencode it + filename = URLEncoder.encode(unEncodedFilename, "UTF-8"); + + } + else if (null != agent && -1 != agent.indexOf("Mozilla")) + { + // if Mozilla then base64 url_safe encoding + filename = MimeUtility.encodeText(unEncodedFilename, "UTF-8", "B"); + + } + else + { + // any others use same filename. + filename = unEncodedFilename; + + } + + return filename; + } }