From c03c0edfaadccc3f30ca41bf34c8730776d5250b Mon Sep 17 00:00:00 2001 From: mh Date: Tue, 2 Apr 2002 22:58:30 +0000 Subject: [PATCH] use ServletContext.getMimeType() as fallback to find media mime-type from .extension instead of broken sun.www.MimeTable.. --- etc/web.xml | 66 ++++++++++++++++++++++ source/mir/misc/FileUtil.java | 38 +------------ .../mircoders/servlet/ServletModuleOpenIndy.java | 47 +++++++++------ .../servlet/ServletModuleUploadedMedia.java | 39 +++++++++---- 4 files changed, 126 insertions(+), 64 deletions(-) diff --git a/etc/web.xml b/etc/web.xml index 91dbf46e..001d9a03 100755 --- a/etc/web.xml +++ b/etc/web.xml @@ -69,6 +69,72 @@ /OutputMir + + + mp3 + + + audio/x-mp3 + + + + + ra + + + audio/vnd.rn-realaudio + + + + + rm + + + application/vnd.rn-realmedia + + + + + mov + + + video/quicktime + + + + + mpg + + + video/mpeg + + + + + avi + + + video/x-msvideo + + + + + asf + + + video/x-ms-asf + + + + + pdf + + + application/pdf + + + + diff --git a/source/mir/misc/FileUtil.java b/source/mir/misc/FileUtil.java index e6558795..ced0d669 100755 --- a/source/mir/misc/FileUtil.java +++ b/source/mir/misc/FileUtil.java @@ -13,25 +13,21 @@ import java.net.*; import freemarker.template.*; import mir.entity.*; import mir.storage.*; -import javax.servlet.http.*; +import javax.servlet.http.*; +import javax.servlet.*; /** * Hilfsklasse zum Mergen von Template und Daten */ public final class FileUtil { - private static boolean fileNameMapLoaded = false; - private static FileNameMap fileNameMap; private static String producerStorageRoot; // // Initialisierung static { - System.setProperty("content.types.user.table", MirConfig.getProp("Home")+ - "content-types.properties"); - fileNameMap = sun.net.www.MimeTable.loadTable(); producerStorageRoot = MirConfig.getProp("Producer.StorageRoot"); } @@ -40,7 +36,7 @@ public final class FileUtil { */ private FileUtil () { } - + public static boolean write(String filename, byte[] in) throws IOException { @@ -100,33 +96,5 @@ public final class FileUtil { } } - private static FileNameMap getFileNameMap() { - if ((fileNameMap == null) && !fileNameMapLoaded) { - fileNameMap = sun.net.www.MimeTable.loadTable(); - fileNameMapLoaded = true; - } - - return new FileNameMap() { - private FileNameMap map = fileNameMap; - public String getContentTypeFor(String fileName) { - return map.getContentTypeFor(fileName); - } - }; - } - - public static void setFileNameMap(FileNameMap map) { - fileNameMap = map; - } - - public static String guessContentTypeFromName(String fname) { - String contentType = null; - - contentType = getFileNameMap().getContentTypeFor(fname); - - return contentType; - } - - - } diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index 01fe8043..6483ef45 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -274,23 +274,36 @@ public class ServletModuleOpenIndy extends ServletModule //the browser is in error, better check against the file extension if (contentType.equals("text/plain") || contentType.equals("application/octet-stream")) { - /** - * This is just a temporary way to get the content-type via - * the .extension , we could maybe use a magic method, by looking - * at the header (first few bytes) of the file. (like the file(1) - * command). - * The Oreilly method relies on the content-type that the client - * browser sends and that sometimes is application-octet stream with - * broken/mis-configured browsers. - * - * The map file should be Mir/content-types.properties, it's the - * default Sun Java file with some additional entries that it did - * not have. So if you support a new media type you have to make - * sure that it is in this file -mh - */ - contentType = FileUtil.guessContentTypeFromName(fileName); - if (contentType==null) - contentType = "text/plain"; // rfc1867 says this is the default + /** + * Fallback to finding the mime-type through the standard ServletApi + * ServletContext getMimeType() method. + * + * This is a way to get the content-type via the .extension, + * we could maybe use a magic method as an additional method of + * figuring out the content-type, by looking at the header (first + * few bytes) of the file. (like the file(1) command). We could + * also call the "file" command through Runtime. This is an + * option that I almost prefer as it is already implemented and + * exists with an up-to-date map on most modern Unix like systems. + * I haven't found a really nice implementation of the magic method + * in pure java yet. + * + * The first method we try thought is the "Oreilly method". It + * relies on the content-type that the client browser sends and + * that sometimes is application-octet stream with + * broken/mis-configured browsers. + * + * The map file we use for the extensions is the standard web-app + * deployment descriptor file (web.xml). See Mir's web.xml or see + * your Servlet containers (most likely Tomcat) documentation. + * So if you support a new media type you have to make sure that + * it is in this file -mh + */ + ServletContext ctx = + (ServletContext)MirConfig.getPropAsObject("ServletContext"); + contentType = ctx.getMimeType(fileName); + if (contentType==null) + contentType = "text/plain"; // rfc1867 says this is the default } HashMap mediaValues = new HashMap(); diff --git a/source/mircoders/servlet/ServletModuleUploadedMedia.java b/source/mircoders/servlet/ServletModuleUploadedMedia.java index c6d74f34..fd662213 100755 --- a/source/mircoders/servlet/ServletModuleUploadedMedia.java +++ b/source/mircoders/servlet/ServletModuleUploadedMedia.java @@ -7,7 +7,7 @@ import mir.media.MediaHelper; import mir.media.MirMedia; import mir.media.MirMediaException; import mir.media.MirMediaUserException; -import mir.misc.FileUtil; +import mir.misc.MirConfig; import mir.misc.MpRequest; import mir.misc.StringUtil; import mir.misc.WebdbMultipartRequest; @@ -24,6 +24,8 @@ import mircoders.storage.DatabaseMediafolder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import javax.servlet.ServletContext; + import java.io.IOException; import java.net.URLEncoder; import java.util.GregorianCalendar; @@ -70,20 +72,33 @@ public abstract class ServletModuleUploadedMedia if (contentType.equals("text/plain") || contentType.equals("application/octet-stream")) { /** - * This is just a temporary way to get the content-type via - * the .extension , we could maybe use a magic method, by looking - * at the header (first few bytes) of the file. (like the file(1) - * command). - * The Oreilly method relies on the content-type that the client - * browser sends and that sometimes is application-octet stream with + * Fallback to finding the mime-type through the standard ServletApi + * ServletContext getMimeType() method. + * + * This is a way to get the content-type via the .extension, + * we could maybe use a magic method as an additional method of + * figuring out the content-type, by looking at the header (first + * few bytes) of the file. (like the file(1) command). We could + * also call the "file" command through Runtime. This is an + * option that I almost prefer as it is already implemented and + * exists with an up-to-date map on most modern Unix like systems. + * I haven't found a really nice implementation of the magic method + * in pure java yet. + * + * The first method we try thought is the "Oreilly method". It + * relies on the content-type that the client browser sends and + * that sometimes is application-octet stream with * broken/mis-configured browsers. * - * The map file should be Mir/content-types.properties, it's the - * default Sun Java file with some additional entries that it did - * not have. So if you support a new media type you have to make - * sure that it is in this file -mh + * The map file we use for the extensions is the standard web-app + * deployment descriptor file (web.xml). See Mir's web.xml or see + * your Servlet containers (most likely Tomcat) documentation. + * So if you support a new media type you have to make sure that + * it is in this file -mh */ - contentType = FileUtil.guessContentTypeFromName(fileName); + ServletContext ctx = + (ServletContext)MirConfig.getPropAsObject("ServletContext"); + contentType = ctx.getMimeType(fileName); if (contentType == null) contentType = "text/plain"; // rfc1867 says this is the default } -- 2.11.0