`

我的工程图片下载部分笔记

阅读更多

接着前些时的图片上传部分,总结下图片下载

下载总结:

 

先看页面:

......................................................................................................................................

<a href="/manager/download.jsp?url=${picNews.photoURL}

&pictureId=${picNews.pictureId }">

<font color="#0000FF">下载</font>

</a>

…………………………………………………………………………………………

这是下载的链接地址,其中指明了图片的下载地址picNews.photoURL,也即图片的上传地址,要下载的图片ID号,处理图片下载的“Action”是 /manager/download.jsp

 

图片要下载,首先必须上传到服务器中,所以下载的流程是:

 

一:service常规

二:SaveUpdateAction同上传,用来处理图片上传(下载)地址。

三:webwork.properties同上传

四:picNews.xwork.xml同上传

五:页面部分,下载的链接即上面那句话放在list页面的操作中(上传是在addupdate页面中的)

 

可见,相对上传来说,下载就是在页面多了个下载的链接地址,还多了个处理下载的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来发送流和读取流。以及把文件转换成流或把流转换成文件的操作。

 

分享到:
评论

相关推荐

    asus华硕笔记本电路图纸

    8. **散热系统**:笔记本的散热系统也是电路图纸的一部分,它涵盖了风扇控制电路和温度传感器,对于处理过热问题至关重要。 9. **故障排查与维修**:电路图纸不仅是设计和制造笔记本的依据,也是维修时的重要参考。...

    IC学习笔记1.7z

    5. **图片理解**:笔记中包含的截图可能是为了辅助理解复杂的概念或流程图,如VCS的命令行界面、波形图、设计结构图等。这些视觉元素有助于读者直观地理解和记忆相关知识。 6. **学习建议**:对于初学者,可以从...

    山东大学电气工程学院 考研电路笔记29-38页

    这些笔记是考生在复习阶段的重要学习材料,通过扫描图片的形式呈现,便于学生查阅和理解。下面将详细解析这9页笔记中的关键内容。 首先,我们关注第29页。这一部分可能涉及到电路的基本概念,如电流、电压、功率等...

    2.5D笔记本电脑商务办公场景工程现场卡通主图商务通用ppt模板.zip

    在当今这个信息爆炸的时代,商务演示和报告已成为我们工作和生活中不可或缺的一部分。它们不仅仅是展示数据和信息的工具,更是我们表达思想、展示成果、规划未来的重要手段。因此,一个合适且高质量的演示文稿模板...

    读书笔记.doc

    虽然实际的内容部分仅包含了一些图片标记,并没有提供具体文字内容,但是我们可以基于标题和描述来推断并总结出关于系统集成项目管理工程师的重要知识点。 ### 一、系统集成项目管理工程师的基本概念 系统集成项目...

    嵌入式开发C语言学习笔记

    根据B站课程“千锋教育嵌入式物联网教程800集,C语言编程入门到精通(物联网开发工程师必备视频”学习记录的C语言部分笔记,完全免费。但是我因为之前学过一部分知识,所以记得都是一些重点或者是一些我没学过的新...

    VUE进阶 笔记贰章 前端工程化

    Vue进阶笔记的第二章主要聚焦于前端工程化,这是一个旨在提高开发效率、优化代码质量和维护性的主题。前端工程化的概念涵盖了许多方面,包括项目构建工具、模块打包、自动化测试、持续集成和部署等。下面将详细探讨...

    山东大学电气工程学院 考研电路辅导笔记16-28

    以前电院开过电路辅导班,专门针对校内的学生。大家知道为什么么?...我按照笔记复习,笔记上的题目都做一遍,反正我考上了还是公费的:)我扫描的清晰图片,很清晰但比较大分三部分。这里放出16-28页

    机器学习深度学习基础算法知识笔记与案例代码.zip

    Document文件夹下为笔记,Code文件夹下为代码,Data文件夹下为某些代码所使用的数据集,Image文件夹下为笔记部分所用到的图片。 机器学习 线性回归(笔记) 感知机(笔记+代码) KNN(笔记+代码) 朴素贝叶斯(笔记...

    究极版.zip 本人笔记-已加密-不要下载

    6. **软件开发**:如果笔记涉及到软件开发,可能包括需求分析、设计模式、测试策略、版本控制等内容,这些都是软件工程的重要组成部分。 7. **个人知识管理**:有效地管理和分享个人知识是现代IT工作中的重要能力,...

    山东大学电气工程学院 考研电路辅导笔记1-15

    以前电院开过电路辅导班,专门针对校内的学生。大家知道为什么么?...我按照笔记复习,笔记上的题目都做一遍,反正我考上了还是公费的:)我扫描的清晰图片,很清晰但比较大分三部分。这里放出1-15页

    前端开发笔记

    本笔记介绍了如何使用Photoshop进行页面制作、面板操作、视图测量、取色、切图、图片保存及优化等操作。 - Sublime和Atom编辑器:这两种编辑器是前端开发中常用的代码编辑工具,支持语法高亮、代码自动补全等功能,...

    信息系统工程师笔记实用.pdf

    下面将详细介绍这些知识点,以便于理解信息系统工程师笔记所涉及的实用知识点。 1. 编程语言与硬件架构 - RISC (Reduced Instruction Set Computing): 精简指令集计算,相对于CISC(复杂指令集计算),RISC架构指令更...

    我的笔记(上层开发)

    这两部分笔记的结合,展现了作者在Web开发的全栈理解,从静态页面的构建到动态交互的实现,再到过时技术的转型和历史沿革。这样的笔记对于任何想要深入理解Web开发的工程师来说都是宝贵的资源,不仅可以学习到技术...

    Smali学习笔记

    ### Smali学习笔记 #### 1. Dalvik与Smali ##### 1.1 Dalvik虚拟机概述 Google推出的Dalvik虚拟机(Dalvik Virtual Machine, DVM)首次亮相是在2007年底,随着Android SDK的发布而一同进入公众视线。这款虚拟机是由...

    keyshot渲染学习笔记

    官方还提供了演示文件下载,供用户免费体验KeyShot的功能与效果,这对于想要了解和学习KeyShot的用户来说是一大福音。 最后,文章中的后记部分提醒我们在处理项目时,选择合适的工具至关重要。对于展示产品设计,...

    android开发板笔记7

    同时,理解和利用Android资源,如字符串、图片、样式和布局,能提高代码的可维护性和国际化支持。 【新版Android开发教程+笔记十三(待续)--应用、permission、资源.pdf】这个文件可能提供了更深入的实践指导。它...

    十几万字前端学习笔记.pdf

    下面将根据提供的部分文档内容,详细展开知识点: **HTML基础** - 标签:HTML文档由标签组成,标签通常成对出现,如`&lt;p&gt;&lt;/p&gt;`,用于包裹段落文本。但也有一些单标签,比如` `用于换行,`&lt;img&gt;`用于插入图片等。...

    2_手写笔记.zip

    【压缩包子文件的文件名称列表】:文件名为“手写笔记”,可能是一个PDF、图片(如JPG或PNG)或其他文本格式,记录了手写内容。在没有具体文件名的情况下,我们无法确定具体内容,但可以预期笔记可能按照主题、章节...

    2019年前端面试题包括笔记和部分代码

    这份"2019年前端面试题包括笔记和部分代码"的资源旨在帮助求职者准备面试,提升他们的竞争力。以下将详细介绍其中可能涵盖的知识点,并拓展相关领域的关键概念。 笔记部分可能会包括以下几个主要模块: 1. **HTML...

Global site tag (gtag.js) - Google Analytics