文件上传,上传的地址在项目路径外。
比如现在上传到到E:\upload\uploadFile下。
文件类型为视频类型。
这个时候需要自己建一个servlet。因为如果要播放视频,需要将路径映射到E:\upload下。
这样读取视频就会非常方便。
代码:注意:url。这个后面要用上的。
@WebServlet(asyncSupported=true //支持异步 ,urlPatterns={"/templates/*"}//路径 ,loadOnStartup=2 ,name="myDefault" ,initParams={ //配置文件路径 } ) public class DefaultServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fullPath = getRealPath(request); response.setDateHeader("Expires", System.currentTimeMillis() + 1000 * 60 * 60 * 24); response.setHeader("Cache-Control", "max-age=60"); ServletOutputStream os = response.getOutputStream(); FileInputStream is = null; try { is = new FileInputStream(fullPath); IOUtils.copy(is, os); } catch (FileNotFoundException e) { response.setStatus(404); return; } finally { if (null != is) { is.close(); } if (os != null) { os.flush(); os.close(); } } } private String getRealPath(HttpServletRequest request) { String cxtPath = request.getContextPath(); String pathInfo = request.getPathInfo(); String uri = request.getRequestURI().substring(cxtPath.length()); if(pathInfo == null){ pathInfo = uri; } String contentFilePath = Constants.UPLOAD_FILE.replaceAll("\\\\", "/"); return contentFilePath+pathInfo; } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } @Override protected long getLastModified(HttpServletRequest request) { String fullPath = getRealPath(request); File file = new File(fullPath); if (file.exists()) { return file.lastModified(); } else { return super.getLastModified(request); } } }
Constants.UPLOAD_FILE即为上传到的地址。
上传的地址都统一将Constants.UPLOAD_FILE(E:\upload\uploadFile)给去掉,最后只剩下一段存储的路径。为什么要去掉?因为以后可能会改变上传的地址。所以改变。
接着,比如我要播放视频,用的ckplay,代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="r" uri="r-tag"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt"%> <input type="hidden" id="videoPath" value="${uploadFilePath }${resourceUri }"> <div class=""> <div id="a1" class="text-center"></div> </div> <script src="<c:url value="/resources/js/ckplayer/ckplayer.js" />"></script> <script type="text/javascript" charset="utf-8"> var hostPost = "http://"+window.location.host; var flashvars = { f : ROOT_PATH+ $("#videoPath").val(), c : 0, b : 1, x : '' }; var params = { bgcolor : '#FFF', allowFullScreen : true, allowScriptAccess : 'always', hostPost:window.location.host }; CKobject.embedSWF(hostPost + '/resources/js/ckplayer/ckplayer.swf', 'a1', 'ckplayer_a1', '96%', '100%', flashvars, params); </script>
如果hostPost是localhost:8080,而没有加上http://,那么将会播放不出任何东西。(这个问题想了半天,,,一定要记住)奇怪的是firBug也没报错,,,
然后这里有个${uploadFilePath}和${resourceUri}。
${uploadFilePath}为"/templates/",这个因为servlet要处理这种请求来获取上传的资源。
这样写有个好处,因为我上传的资源还有HTML包,也就是一大堆的HTML静态文件。
这些HTML文件之间是有联系的。
而这样获取文件,会非常方便。
附上web.xml的servlet配置
<servlet> <servlet-name>myDefault</servlet-name> <servlet-class>com.boventech.util.DefaultServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myDefault</servlet-name> <url-pattern>/templates/*</url-pattern> </servlet-mapping>