wap开发中,每一个src或者href的数据都可能来自本地,网络,或者socket
java中可以直接读取网络流,.net下好像读取网络流会有点问题(不支持查询),好像需要现保存后读取
public void RequestFile(HttpServletRequest request, HttpServletResponse response) {
String serverurl = "";
if (request.getParameter("serverurl") != null)
serverurl = request.getParameter("serverurl");
if(serverurl.startsWith("file:"))
serverurl = serverurl.substring(5);
// 需要考虑多种情况,本地下载,网络下载,SOCKET下载等等
// url = HttpHelper.decode(url);
InputStream inStream = null;
if (url.toLowerCase().startsWith("http://")) {
// 网络文件
HttpClient httpClient = new HttpClient();
GetMethod getHC = new GetMethod(url);
try {
int statusCode = httpClient.executeMethod(getHC);
if (statusCode == HttpStatus.SC_OK) {
inStream = getHC.getResponseBodyAsStream();
}
} catch (IOException e) {
e.printStackTrace();
}
View(inStream, url, response);
}
else if (!serverurl.startsWith("?")){
// 本地文件
serverurl = WapRoot + request.getSession().getAttribute("appfolder") + File.separatorChar + serverurl;
try {
inStream = new FileInputStream(serverurl);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
View(inStream, serverurl, response);
}
else {
// socket文件
//需要判断socket头是是下载,还是预览?
//重构socket地址和post数据
String postData = "";
//注意postData格式!!!eg : serveraction=previewfile@mobiledisk&url=%2F%2F0651017481693288.jpg
if(serverurl.startsWith("http://"))
{
//表示网络文件,和流不一样的命令
postData = "serveraction=viewfileremote&url="+serverurl;
}
else
{
postData = GetServerUrl(request);
}
//请求url
String url = request.getSession().getAttribute("defaulturl").toString();
//Write(postData);
try {
URL httpUrl = new URL(url);
URLConnection conn = httpUrl.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
//如果cookie存在,则发送过去
if(request.getSession().getAttribute("cookie") != null)
{
conn.setRequestProperty("Cookie", request.getSession().getAttribute("cookie").toString());
}
// post数据到服务器
OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream());
osw.write(postData);
osw.flush();
osw.close();
//读取socket中转服务返回的数据
inStream = conn.getInputStream();
String contentType = conn.getContentType();
String filename = conn.getHeaderField("Content-Disposition");
if(filename != null && filename.indexOf("filename=") > -1)
filename = filename.substring(filename.indexOf("filename=") + 9);
if(contentType != null && contentType.indexOf("application/octet-stream") > -1)
Download(inStream, url, filename, response);
else
View(inStream, url, contentType, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* @author yesun
* 功能:预览文件
* @param inStream
* @param url
* @param response
*/
public void View(InputStream inStream, String url, HttpServletResponse response)
{
View(inStream, url, null, response);
}
/**
* @author yesun
* 功能:预览文件
* @param inStream
*/
public void View(InputStream inStream, String url, String contentType, HttpServletResponse response)
{
String filename = "";
if(url.lastIndexOf(File.separatorChar + "") > -1)
filename = url.substring(url.lastIndexOf(File.separatorChar + ""));
else
filename = url;
if (inStream != null) {
byte[] b = new byte[1024];
int len = 0;
try {
// 读到流中
// 设置输出的格式
response.reset();
response.setCharacterEncoding("utf-8");
//response.setHeader("Content-Disposition", "attachment;filename=" + HttpHelper.encode(filename, "utf-8"));
// 开始解析
if(contentType == null || contentType.equals(""))
{
String extendName = url.toLowerCase().substring(url.lastIndexOf(".") + 1);
if (extendName.equals("doc")) {
response.setContentType("application/msword;charset=utf-8");
} else if (extendName.equals("ppt")) {
response.setContentType("application/vnd.ms-powerpoint;charset=utf-8");
} else if (extendName.equals("xls")) {
response.setContentType("application/vnd.ms-excel;charset=utf-8");
} else if (extendName.equals("jpg")) {
response.setContentType("image/jpeg;charset=utf-8");
} else if (extendName.equals("gif")) {
response.setContentType("image/gif;charset=utf-8");
} else if (extendName.equals("png")) {
response.setContentType("image/png");
} else if (extendName.equals("bmp")) {
response.setContentType("image/bmp;charset=utf-8");
} else if (extendName.equals("htm") || extendName.equals("html") || extendName.equals("shtml") || extendName.equals("xhtml")) {
response.setContentType("text/html;charset=utf-8");
} else if (extendName.equals("txt")) {
response.setContentType("text/plain;charset=utf-8");
} else {
response.setContentType("application/octet-stream;charset=utf-8");
}
}
else
{
response.setContentType(contentType);
}
response.setHeader("Content-Disposition", "attachment;filename=" + HttpHelper.encode(filename, "utf-8"));
// 循环取出流中的数据
while ((len = inStream.read(b)) > 0) {
response.getOutputStream().write(b, 0, len);
response.flushBuffer();
}
response.getOutputStream().close();
inStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @author yesun
* 功能:下载览文件
* @param inStream
*/
public void Download(InputStream inStream, String url, HttpServletResponse response)
{
Download(inStream, url, null, response);
}
/**
* @author yesun
* 功能:下载览文件
* @param inStream
*/
public void Download(InputStream inStream, String url, String filename, HttpServletResponse response)
{
if(filename == null || filename.equals(""))
{
if(url.lastIndexOf(File.separatorChar + "") > -1)
filename = url.substring(url.lastIndexOf(File.separatorChar + ""));
else
filename = url;
}
byte[] b = new byte[10*1024];
int len = 0;
try {
// 设置输出的格式
response.reset();
response.setCharacterEncoding("utf-8");
// 开始解析
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + HttpHelper.encode(filename, "utf-8"));
// 循环取出流中的数据
while ((len = inStream.read(b)) > 0) {
response.getOutputStream().write(b, 0, len);
response.flushBuffer();
}
response.getOutputStream().close();
inStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}