接着前些时的图片上传部分,总结下图片下载
下载总结:
先看页面:
......................................................................................................................................
<a href="/manager/download.jsp?url=${picNews.photoURL}
&pictureId=${picNews.pictureId }">
<font color="#0000FF">下载</font>
</a>
…………………………………………………………………………………………
这是下载的链接地址,其中指明了图片的下载地址picNews.photoURL,也即图片的上传地址,要下载的图片ID号,处理图片下载的“Action”是 /manager/download.jsp。
图片要下载,首先必须上传到服务器中,所以下载的流程是:
一:service常规
二:Save和Update的Action同上传,用来处理图片上传(下载)地址。
三:webwork.properties同上传
四:picNews.xwork.xml同上传
五:页面部分,下载的链接即上面那句话放在list页面的操作中(上传是在add和update页面中的)
可见,相对上传来说,下载就是在页面多了个下载的链接地址,还多了个处理下载的download.jsp
<%@ page contentType="application/octet-strea;
(application/octet-stream表示上传的文件是二进制数据流)
charset=gb2312" pageEncoding="GBK" language="java"
%><%@page import="com.MS.util.ServletUtils"
%><%@page import="JJYX.service.IAdminService"
%><%@page import="com.MS.spring.ApplicationContextClass"
%><%@page import="com.MS.common.ContextClass"
%><%@page import="JJYX.service.IPicNewsService"
%><%@page import="JJYX.entity.PicNews"
%><%@page import="com.MS.util.LongUtils"
%><%@page import="com.jspsmart.upload.SmartUpload"
%><%
response.reset();
IAdminService adminService = (IAdminService) ApplicationContextClass.getBean("adminService");
ContextClass context = adminService.getOnlineAdmin(session.getId());
if (context != null && context.getAdminId() != 0)
{
SmartUpload smartUpload = new SmartUpload();
smartUpload.initialize(getServletConfig(), request, response);
smartUpload.setContentDisposition(null);
try
{
smartUpload.downloadFile(ServletUtils.getRequestValue(request, "url"));
smartUpload = null;
IPicNewsService picNewsService = (IPicNewsService) ApplicationContextClass.getBean("picNewsService");
PicNews picNews= picNewsService.getPicNewsById(LongUtils.getLong(ServletUtils.getRequestValue(request, "pictureId")));
if (picNews != null)
{
//picNews.setStatus(1);//判断图片是否下载
picNewsService.updatePicNews(picNews);
}
}
catch(Exception ex)
{
request.setAttribute("message", "对不起,存在如下错误信息: " + ex.getMessage());
pageContext.forward("/WEB-INF/jsp/manager/message.jsp");
ex.printStackTrace();
}
}
%>
附:用Jsp来实现下载的几种方式
.最直接最简单的方式是把文件地址直接放到html页面的一个链接中。这样做的缺点是把文件在服务器上的路径暴露了,并且还无法对文件下载进行其它的控制(如权限)。
直接让客户端浏览器下载已知类型的文件
Web开发人员都有过这样的疑问,如何让一个文件,尤其是一个已知类型的文件,发送到客户端,直接提示让浏览者下载,而不是用与它相关联的程序打开。以前我们最常用的办法就是把这样的文件加到链接上,这样可以让浏览者通过点击鼠标右键的目标另存为来下载所链接的文件。但是,这样有两个不足的地方:
一是:如果浏览器能够识别已下载文件的扩展名,则浏览器就会激活该扩展名所关联的程序来打开所下载的文件。比如:在Windows平台上,如果用户点击的链接链接的是一个“.doc”文件的话,那么,浏览器就会启动Microsoft Word应用程序来打开它。
二是:如果采用链接的办法的话,任何能看到该链接的人都可以下载该文件,你虽然也可以对所下载的文件进行权限设置,但那样做也不是很方便的。有时候我们需要更为灵活和富有弹性的方式,下面的程序能够很方便地克服以上两方面的不足。
这种办法是可靠的,但必须记住:没有授权的用户不能够通过在浏览器地址栏里输入文件的URL来取得该文件的下载权。所以,要下载的文件应该放到虚拟目录之外的一个目录里,比如:如果你的虚拟目录是C:\Mengxianhui\Tomcat4\Website\MyApp的话,那么,存放在该目录和该目录下的任何子目录下所有文件对因特网上的任何用户都是可见的。要直接下载一个文件,我们需要做两件事,第一件事是:设定响应的内容类为“application/octet-stream”,大小写无关。第二件事是:设置HTTP的响应头名字为:Content-Disposition,设定值为:attachment; filename = theFileName。这里的theFileName就是出现在文件下载对话框里的默认文件名,通常和所下载的文件名字相同,但也可以不同。
举例:
TestFileDownload.JSP页面的例子:
<%
// 得到文件名字和路径
String filename = "MengxianhuiDocTest.doc";
String filepath = "D:\\";
// 设置响应头和下载保存的文件名
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition",
"attachment; filename=\"" + filename + "\"");
// 打开指定文件的流信息
java.io.FileInputStream fileInputStream =
new java.io.FileInputStream(filepath + filename);
// 写出流信息
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
%>
值得注意的是:在你要下载的文件内容里,除了文件的内容之外,不应该再附加有其它任何的字符,包括空格和回车换行符。我们有时在编写代码的时候,为了使代码清晰可读,往往会添加一些空格、制表符或者回车换行符,这样虽然看起来比较清晰,但有时可能会得不到正确的结果。比如:
<%@ page import="java.io.*"
%> <jsp:useBean id="MyBeanFromMengxianhui" scope="page"
class="com.Mengxianhui.DownloadBean" />
应该写成这样:
<%@ page import="java.io.*"
%><jsp:useBean id="MyBeanFromMengxianhui" scope="page"
class="com.Mengxianhui.DownloadBean" />
2.在服务器端把文件转换成输出流,写入到response,以response把文件带到浏览器,由浏览器来提示用户是否愿意保存文件到本地。(示例如下)
3.既然是JSP的话,还有一种方式就是用Applet来实现文件的下载。不过客户首先得信任你的这个Applet小程序,由这个程序来接受由servlet发送来的数据流,并写入到本地。
Servlet端示例
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType(" text/plain ");
OutputStream outputStream = null;
try {outputStream = res.getOutputStream();
//把文件路径为srcFile的文件写入outputStream中popFile(srcFile, outputStream)) ;
} catch (IOException e) {e.printStackTrace(); }}
JApplet端示例
URLConnection con;
try {
//url是被调用的SERVLET的网址 如 *.do
con = url.openConnection();con.setUseCaches(false);
con.setDoInput(true);con.setDoOutput(true);
con.setRequestProperty("Content-Type","application/octet-stream");
InputStream in = con.getInputStream();
ProgressMonitorInputStream pmInputStream = new ProgressMonitorInputStream(pane, "正在从服务器下载文件内容", in);
ProgressMonitor pMonitor = pmInputStream.getProgressMonitor();
pMonitor.setMillisToDecideToPopup(3);
pMonitor.setMillisToPopup(3);
//localfilepath本地路径,localstr文件文件夹,filename本地文件名String localfilepath = localstr + filename ;
//方法saveFilsaveFilee是把输入流pmInputStream写到文件localfilepath中
if(saveFilsaveFilee(localfilepath,pmInputStream)){
openLocalFile(localfilepath);
}
4.顺便把JApplet上传文件的代码也贴上来.
JApplet端示例
URLConnection con;
try {con = url.openConnection();
//url是被调用的SERVLET的网址 如 *.do
con.setUseCaches(false);
con.setDoInput(true);con.setDoOutput(true);
con.setRequestProperty("Content-Type","application/octet-stream");
OutputStream out = con.getOutputStream();
//localfilepath本地路径,localstr文件文件夹,filename本地文件名String localfilepath = localstr + filename;
//文件getOutputStream是把文件localfilepath写到输出流out中getOutputStream(localfilepath,out);InputStream in = con.getInputStream();
return true;}catch (IOException e)
{System.out.println("文件上传出错!");
e.printStackTrace();
}s
ervlet端代码示例
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType(" text/plain ");
InputStream inputStream = null;
try {inputStream = res.getInputStream();
//把输入流inputStream保存到文件路径为srcFile的文件中writefile(srcFile, inputStream);} catch (IOException e) {e.printStackTrace();}} // end service
总结:在文件的传输中是流的形式存在的,在硬盘上是文件的形式存在的。我们要做的只是通过HttpServletRequest和HttpServletResponse,或者是response和request来发送流和读取流。以及把文件转换成流或把流转换成文件的操作。