文件上传,上传的地址在项目路径外。
比如现在上传到到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。
如果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>