这个周末终于可以好好锻炼一下我的IBM ThinkPad T43了。今天看了一些关于JSP,Servlet方面的资料,写了简单的两个JavaBean。一个是UpLoad,一个是DownLoad。写得很简单,没有使用其它任何组件,自己做的。大家可以来看看。

1.RunningUpLoader上传Bean

首先是RunningUpLoader.java,代码有些多,因为我是自己来解析输入流的。

package testupload;
import java.io.*;
import javax.servlet.http.HttpServletRequest;

public class RunningUpLoader {
    public RunningUpLoader() {
    }

/**
     * 上传文件
     * @param request HttpServletRequest Servlet的请求对象
     * @param name String 要上传的文件在表单中的参数名
     * @param fileName String 保存在服务器上的文件名
     * @throws IOException
     */
    public void doUpload(HttpServletRequest request, String name,String fileName) throws
            IOException {
        InputStream in = request.getInputStream();
        byte[] buffer = getFileContent(name,in);
        FileOutputStream fos = new FileOutputStream(fileName);
        fos.write(buffer,0,buffer.length-1);
        fos.close();
    }

/**
     * 获取上传的文件buffer,结尾处将多一个换行符
     * @param name String 文件上传参数的名字
     * @param is InputStream 服务器对话的输入流
     * @return byte[] 返回获取的文件的buffer,结尾处多一个换行符
     * @throws IOException
     */
    private byte[] getFileContent(String name, InputStream is) throws IOException{
        int index;
        boolean isEnd = false;
        byte[] lineSeparatorByte;
        byte[] lineData;
        String content_disposition;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        BufferedInputStream bis = new BufferedInputStream(is);

lineSeparatorByte = readStreamLine(bis);
        while(!isEnd) {
            lineData = readStreamLine(bis);
            if(lineData == null) {
                break;
            }
            content_disposition = new String(lineData,"ASCII");
            index = content_disposition.indexOf("name=/"" + name + "/"");
            if (index >= 0 && index < content_disposition.length()) {
                System.out.println(readStreamLineAsString(bis)); // skip a line
                System.out.println(readStreamLineAsString(bis)); // skip a line

while ((lineData = readStreamLine(bis)) != null) {
                    System.out.println(new String(lineData));
                    if (isByteArraystartWith(lineData, lineSeparatorByte)) { // end
                        isEnd = true;
                        break;
                    } else {
                        bos.write(lineData);
                    }
                }
            }else {
                lineData = readStreamLine(bis);
                if(lineData == null)
                    return null;
                System.out.println(new String(lineData,"ASCII"));
                while(!isByteArraystartWith(lineData, lineSeparatorByte)) {
                    lineData = readStreamLine(bis);
                    if(lineData == null)
                        return null;
                    System.out.println(new String(lineData,"ASCII"));
                }
            }
        }
        return bos.toByteArray();
    }

private byte[] readStreamLine(BufferedInputStream in) throws IOException{
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int b = in.read();
        if(b== -1)
            return null;
        while(b != -1 && b != '/n') {
            bos.write(b);
            b = in.read();
        }
        return bos.toByteArray();
    }

private String readStreamLineAsString(BufferedInputStream in) throws IOException {
        return new String(readStreamLine(in),"ASCII");
    }

private boolean isByteArraystartWith(byte[] arr,byte[] pat) {
        int i;
        if(arr == null || pat == null)
            return false;
        if(arr.length < pat.length)
            return false;
        for(i=0;i<pat.length;i++) {
            if(arr[i] != pat[i])
                return false;
        }
        return true;
    }
}

上传文件文件的时候,需要在之前的html中增加一个form表单,里面需要有个<input type="file" name="fileUpload" >的输入按钮。这样,浏览器才会将要上传的文件递交给服务器。 其中name="fileUpload"的名字,就是RunnningUpLoader.doUpload函数中的name参数。

使用的时候直接用bean就OK了。比如upload.jsp如下:

<jsp:useBean id="upBean" scope="page" class="testupload.RunningUpLoader" />

<%

upBean.doUpload(request,"fileupload","runningUpLoad.txt");

%>

2. RunningDownLoader下载Bean

package testupload;
import java.io.*;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;

public class RunningDownLoader {
    public RunningDownLoader() {
    }

public void doDownload(HttpServletResponse response, String filePath,String fileName) throws
            IOException {
        response.reset();//可以加也可以不加
     response.setContentType("application/x-download");//设置为下载application/x-download
     System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
     String filenamedownload = filePath;
     String filenamedisplay = fileName;//系统解决方案.txt
     filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");--解决下载中文文件名文件的问题
     response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);

OutputStream output = null;
     FileInputStream fis = null;
     try
     {
         output  = response.getOutputStream();
         fis = new FileInputStream(filenamedownload);

byte[] b = new byte[1024];
         int i = 0;

while((i = fis.read(b)) > 0)
         {
             output.write(b, 0, i);
         }
         output.flush();
     }
     catch(Exception e)
     {
         System.out.println("Error!");
         e.printStackTrace();
     }
     finally
     {
         if(fis != null)
         {
             fis.close();
             fis = null;
         }
         if(output != null)
         {
             output.close();
             output = null;
         }
     }

}

}

下载文件,最好是做到Servlet上。直接在Servlet的doGet下面增加如下代码即可

//Process the HTTP Get request
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
        RunningDownLoader downloader= new RunningDownLoader();
        downloader.doDownload(response,"E://MyProjects//testupload.rar","upload.bin");
    }

自己的一点心得:

我要实现一个文件下载的功能,在找到这篇文章之前,我看了jspsmart的有关文章,几行代码就可以解决下在问题,

但对下载的实现原理:确不怎么清楚,虽然以前也用servlet自己写过下载的功能 ,由于时间太长已经记不太清楚了,

现在看了整个思路都清晰了,

我们不是为了解决问题而解决问题,问题解决了你如果没有学到新的知识或经验,也许下次遇到问题的时候还是只知道到网上去baidu,却永远都打不开自己的思路,当遇到网络上没有的难题时,就手足无措了,所以永远都成不了高手,

学习原理才能举一反三.

转载tangl_99的Servlet 实现文件上传下载--自己的一点心得相关推荐

  1. 如何用JSP+Servlet实现文件上传下载

    目录 一.辛老师教程 一.需要的文件: 二.上传步骤: 三.下载步骤 二.代码 1.前端 2.后端 3.web.xml 三.梳理框架 1.前端 2.后端 一.辛老师教程 一.需要的文件: (3条消息) ...

  2. 通过ajaxFileUpload异步请求上传文件(ajaxFileUpload+servlet实现文件上传下载)

    1.最终效果 实现选择图片(此处以图片为例,支持所有类型文件的上传),选择之后将选择的图片在页面中显示出来,点击上传,可以将文件上传到指定的地址中,上传成功后在当前页面自动显示下载标签. 源码下载地址 ...

  3. Java Servlet实现文件上传下载操作

    1.配置对应的文件,导入相应的包 对应包下载地址:https://wws.lanzous.com/ipFtEoyv1je 2.编写jsp页面 代码如下: <%@ taglib prefix=&q ...

  4. servlet实现文件上传,预览,下载和删除

    一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转 ...

  5. 文件上传下载—servlet API实现

    servlet API实现文件上传下载需要的jar包: UploadServlet.java package com.ymw.web.servlet;import java.io.File; impo ...

  6. servlet文件上传下载_Servlet上传文件和下载文件示例

    servlet文件上传下载 Java Web应用程序中的文件上载和下载以及常见任务. 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例 ...

  7. html网页上传到服务器_JSP+Servlet实现文件上传到服务器功能

    本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao.service.servlet 这 ...

  8. jsp 如何上传文件到服务器上,如何使用JSP / Servlet将文件上传到服务器?

    问题: How can I upload files to server using JSP/Servlet? 如何使用JSP / Servlet将文件上传到服务器? I tried this: 我尝 ...

  9. c语言 上传图片至服务器,JSP+Servlet实现文件上传到服务器功能

    本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao.service.servlet 这 ...

最新文章

  1. Java8中Stream流对集合操作
  2. 注册界面php mysql_php:用户登录注册并存入数据库的简单网页示例
  3. 几何画板200个经典课件_动态几何画板 Geogebra
  4. Windows编程—杀死指定路径程序文件的进程
  5. linux添加开机自启动脚本
  6. oracle--存储过程--bai
  7. c# throw抛出上一个异常
  8. (Node*)malloc(sizeof(Node))的理解
  9. 水很深的深度学习(四)——卷积神经网络CNN
  10. 录屏直播时,只有部分屏幕的解决办法
  11. 扫描转换html,HTML5/CSS3 3D雷达扫描动画
  12. Wincc语音报警 Wincc真人声音报警
  13. 色彩搭配及设计金字塔的总结
  14. IP地址中的网络地址和主机地址分别是什么意思
  15. 基于cosmol软件的光纤热力学分析
  16. WiFi的商业运作模式
  17. 2020年最鼓舞人心的句子
  18. window.open父子页面,子页面关闭回调事件样例
  19. 传感网应用开发(环境部署)
  20. ros--rosbag

热门文章

  1. flink 1.14编译:flink-fs-hadoop-shaded找不到
  2. 关系抽取调研——工业界
  3. 一步步教你如何在线申请国内商标
  4. 【原创】博物馆库房环境空气质量无线温湿度监控技术性方案
  5. 编译原理(二)文法和语言、符号和符号串、文法的类型、语法树
  6. c++、7-5 估算数学常数e的值
  7. 一文看透 Kotlin 协程本质
  8. 计算机技术对艺术的影响,数字化技术对当代艺术发展的影响--理论
  9. 中国伸缩式起重机行业市场供需与战略研究报告
  10. 【Oracle11g官方文档阅读】DBA Essentials-上篇