If
you never heard about the BalusC
FileServlet
then it is time to find out about it! Starting with OmniFaces 2.2, the FileServlet was slightly
refactored, rewritten and modernized with:
-
fast NIO stuff instead of legacy RandomAccessFile;
-
properly deals with ETag, If-None-Match and If-Modified-Since caching
requests;
-
properly deals with Range and If-Range ranging
requests (RFC7233), which is
required by most media players and by web browsers
proper audio/video streaming
a proper resume of an paused download
download accelerators to be able to request smaller parts simultaneously
proper audio/video streaming
a proper resume of an paused download
download accelerators to be able to request smaller parts simultaneously
This
servlet is ideal for large files like media files placed outside the
web application and you can't use the default servlet.
You
can easily exploit FileServlet by
extending this class and overriding the getFile(HttpServletRequest) method to
return the desired file. The OmniFaces Showcase also provide an example of
implementation, listed below (I just adjusted the path to point, D:\media\):
@WebServlet("/media/*")
public class
MediaFileServlet extends FileServlet {
private File folder;
@Override
public void init() throws ServletException {
folder = new File("D:\\media\\");
}
@Override
protected File getFile(HttpServletRequest
request) throws IllegalArgumentException {
String pathInfo = request.getPathInfo();
if (pathInfo == null || pathInfo.isEmpty() ||
"/".equals(pathInfo)) {
throw new IllegalArgumentException();
}
return new File(folder, pathInfo);
}
}
If
you want to trigger a HTTP
400 "Bad Request" error, simply throw IllegalArgumentException. If you
want to trigger a HTTP
404 "Not Found" error, simply return null, or a
non-existent file. Moreover, you can shape this Servlet behavior by overriding
the following methods:
-
long getExpireTime(HttpServletRequest,
File)
- By default, the resource may be cached by the client before it expires for 30
days (in seconds). Via this method you can alter this value. Pass in the
involved request and file and return the desired number of seconds.
- String
getContentType(HttpServletRequest request, File file) - The default implementation delegates File.getName() to ServletContext.getMimeType(String) with a fallback default value of application/octet-stream. If you
want to alter this behavior pass in the involved request and file and return
the desired content type (e.g. for PNG, add return "image/png";).
-
boolean
isAttachment(HttpServletRequest request, String contentType) - By default,
it returns true if the
content type does not start with text or image, and the Accept request header is either null or does
not match the given content type. If you want to alter this behavior pass in the
involved request and content type and return the desired value. For example,
some browsers tend to download a video instead of playing it (e.g. Google
Chrome). In order to prevent this, you can override this method to return false (this
will cause FileServlet to add in
response headers the Content-Disposition as inline instead
of attachment:
@Override
protected
boolean isAttachment(HttpServletRequest request, String contentType) {
return false;
}
Example of loading external
images/videos/pdfs
Let's
suppose that we have several images/videos and pdf documents in a folder named media under D: disk. So,
the path for an image named, cartoon.png will be, D:\media\cartoon.png. We want to load these resources in a
web application via pure HTML and JSF tags. Our application uses the /faces/* prefix
mapping for faces servlet.
Example of loading images (complete
application here)
Load
the image, D:\media\cartoon.png
HTML: <img
src="#{request.contextPath}/faces/media/cartoon.png"/>
JSF: <h:graphicImage
url="faces/media/cartoon.png"/>
<h:graphicImage
value="faces/media/cartoon.png"/>
PrimeFaces: <p:graphicImage url="faces/media/cartoon.png"/>
<p:graphicImage
value="faces/media/cartoon.png"/>
Example of loading videos (complete
application here)
Load
the video, D:\media\movie.mp4
HTML: <video
width="400" controls="controls">
<source
src="#{request.contextPath}/faces/media/movie.mp4"
type="video/mp4"/>
<source src="#{request.contextPath}/faces/media/movie.ogg"
type="video/ogg"/>
Your browser does not support HTML5 video.
</video>
PrimeFaces: <p:media value="faces/media/movie.mp4"
width="400">
<f:param name="autoplay"
value="false" />
</p:media>
Example of loading pdf (complete
application here)
Load
the video, D:\media\sample.pdf
HTML: <object
width="400" height="500" type="application/pdf"
data="#{request.contextPath}/faces/media/sample.pdf">
<p>Insert your error message here, if
the PDF cannot be displayed.</p>
</object>
PrimeFaces: <p:media value="faces/media/sample.pdf"
width="400" height="500" />
Niciun comentariu :
Trimiteți un comentariu