J2EE文件上传与下载小结

一、文件上传

上传流程:

1、jsp页面上传文件

2、后台获取文件流(原理都是一样的,实现方式有所不同。

sevelet一般用ServletFileUpload从HttpServletRequest获取;

struts2会自动将文件流封装为File对象;springmvc则是MultipartFile)

3、获取输出流,在相应目录生成文件

下面结合以前做的项目,我给个简单的例子。

前台jsp上传代码就有不说了。如果用form的话,enctype="multipart/form-data"注意别丢了。

由于一般项目有多个地方需要上传文件,所以上传代码我一般建一个文件处理类,上传地址都在配置文件里配置。代码如下:

    /**
     * 根据配置文件的key获取对应的值
     * @param key
     * @return
     */
    public static String getPropertyValue(String key){
        Properties props = new Properties();
        InputStream in = null;
        in = FileTools.class.getClassLoader().getResourceAsStream("config.properties");
        try {
            props.load(in);
            in.close();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }    

        return props.getProperty(key);
    }

    /**
     * 上传单个文件
     * @param uploadFile 上传的文件
     * @param uploadFileName 上传的文件名称
     * @param uploadPath 上传的文件保存地址
     * @return
     */
    public static ResponseJson uploadFile(File uploadFile, String uploadFileName,String uploadPath) {
        ResponseJson responseJson = new ResponseJson();
        Result result = new Result();
        boolean success = false;
        if(uploadPath==null){
            //如果服务器是linux,需要修改为filePathForLinux
            String os = IpUtils.getOSName();
            if (os.startsWith("linux")||os.startsWith("Linux")){
                uploadPath = getPropertyValue("filePathForLinux");
            }else{
                uploadPath = getPropertyValue("filePath");
            }
        }
        uploadPath = uploadPath + File.separator + DateUtils.getYMD();
        System.out.println("上传文件临时名称: " + uploadFile.getName());
        System.out.println("文件原名: " + uploadFileName);
        System.out.println("文件保存地址: "+uploadPath);
        //查看文件大小
        if(uploadFile.length()<=0){
            result.setMsg("上传的文件为空文件");
        }else if(uploadFile.length()>0 && uploadFile.length()<153600000){
            File file1 = new File(new File(uploadPath), uploadFileName);
            if (file1.exists()) {
                result.setMsg("已经有同名文件存在");
            }else {
                File dir = new File(uploadPath);
                if (!(dir.exists()))
                    dir.mkdirs();
                //上传文件
                try {
                    FileUtils.copyFile(uploadFile, file1);
                    result.setMsg("文件上传成功");
                    success = true;
                } catch (IOException e) {
                    e.printStackTrace();
                    result.setMsg("文件保存不成功");
                }
            }
        }else{
            result.setMsg("上传的文件大于50M");
        }
        result.setSuccess(success);
        result.setName(uploadFileName);
        responseJson.setFilePath(uploadPath);
        responseJson.setSuccess(success);
        responseJson.setResult(result);
        return responseJson;
    }

代码中

            //如果服务器是linux,需要修改为filePathForLinux
            String os = IpUtils.getOSName();
            if (os.startsWith("linux")||os.startsWith("Linux")){
                uploadPath = getPropertyValue("filePathForLinux");
            }else{
                uploadPath = getPropertyValue("filePath");
            }

解释:

a>.这一块主要是因为我在windows下开发测试的上传路径和linux下不一样(因为我都用的是绝对路径),

因此如果不这样判断的话,每次开发完部署到服务器上时,路径就出错。所以我就先判断当前是什么系统,然后就调用该系统对应的上传目录

b>.除此之外,文件上传还需要判断文件类型、文件大小等,但个人认为这些最好是在前台做判断,做判断的目的就是为了不要让不合理的文件传到后台,对吧?

那如果在后台判断的话,你文件都传到后台了,还进行什么判断,不是已经迟了吗?无非就是保存与不保存的区别了

二、文件下载

相对于上传而言,下载逻辑就稍微复杂点了。流程如下:

1、读取待下载文件路径。

2、获取文件输入流(从待下载文件获取输入流)

3、设置文件输出流(即设置HttpServletResponse)。

4、核心:从输入流读入文件,从输出流生成文件。

示例代码如下:

    /**
     * 下载单个文件
     * @param response
     * @param filePath 下载的文件保存地址
     * @param fileName 下载的文件名称
     * @return
     * @throws Exception
     */
    public static Result downloadFile(HttpServletResponse response,String filePath,String fileName) throws Exception {
        Result result = new Result();
        result.setSuccess(false);
        if("".equals(filePath)||null==filePath){
            result.setMsg("文件路径异常");
        }else{
//            File file = new File(filepath);
            System.out.println("-------开始下载--------"+fileName);
            File file = new File(filePath,fileName);
            if(file.exists()){
                response.setHeader("Content-Type", "application/force-download");
                //把文件名转码使前台可以显示中文名
                response.setHeader("Content-Disposition", "attachment; filename=\""+
                            new String(fileName.getBytes("gb2312"), "ISO8859-1" )+"\"");  

                ServletOutputStream os = response.getOutputStream();
                BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
                try {
                    byte[] content = new byte[1024];
                    int length;
                    while ((length = fin.read(content, 0, content.length)) != -1){
                        os.write(content, 0, length);
                    }
                    result.setSuccess(true);
                } catch (Exception e) {
                    System.out.println("文件下载失败");
                    result.setMsg("文件下载失败");
                }finally{
                    fin.close();
                    os.flush();
                    os.close();
                }
            }else{
                System.out.println("要下载的文件不存在");
                result.setMsg("要下载的文件不存在");
            }
        }
        return result;
    }

解释:

a>.这里返回的是我自定义的Result消息类,用于封装下载操作返回的信息。

b>.当然response头的设置不是唯一的,适合自己的就是最好的。

c>.文件下载过程中还会遇到乱码问题,无非就是字符集混乱了,耐心点就肯定能解决。

好了,简要的总结就到这里了。

时间: 2024-08-06 22:37:11

J2EE文件上传与下载小结的相关文章

Http服务器实现文件上传与下载(四)

一.引言 欢迎大家来到和我一起编写Http服务器实现文件的上传和下载,现在我稍微回顾一下之前我说的,第一.二章说明说明了整体的HTTP走向,第三章实现底层的网络编程.接着这一章我想给大家讲的是请求获取,和响应发送的内容.这里主要讲解的响应内容,为什么?因为我们编写的是一个与浏览器交互的HTTP服务器,所以大多数的情况下我们只进行被动的应答. 这就是一种"提问--回答"的问题.其实在讲解这章的时候,我本来准备给大家讲解一下Linux一些信号中断的问题.因为在网络层发送的时候,系统会发送一

Http服务器实现文件上传与下载(一)

一.引言 大家都知道web编程的协议就是http协议,称为超文本传输协议.在J2EE中我们可以很快的实现一个Web工程,但在C++中就不是非常的迅速,原因无非就是底层的socket网络编写需要自己完成,上层的http协议需要我们自己完成,用户接口需要我们自己完成,如何高效和设计一个框架都是非常困难的一件事情.但这些事情Java已经在底层为我们封装好了,而我们仅仅只是在做业务层上的事情吧了. 在本Http服务器实现中,利用C++库和socket原套接字编程和pthread线程编写.拒绝使用第三方库

java实现文件上传和下载

写在前面 [文件上传和下载]是很多系统必备功能, 比如PM\OA\ERP等:系统中常见的开发模式有B/S和C/S,而前者主要是通过浏览器来访问web服务器,一般采用七层协议中的[应用层http]进行数据传输,后者主要通过编程语言开发的app作为客户端来访问服务端,一般采用七层协议中的[传输层tcp]进行数据传输. 文章主要完成简单java web涉及的文件上传和下载功能. 正文 1. java原生servlet实现: pom.xml配置: <dependency> <groupId>

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

深入分析JavaWeb Item40 -- 文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

文件上传与下载!

1.上传: 1.上传数据的类型:字符,字节 1.文本类型(字符):通过url网址的?:通过表单元素:AJAX. 2.文件类型(字节):通过表单元素(file). 2.上传文件的方式: 1.form表单实现文件上传:常用方式(上传文件用post,不用get,因为get方式对于上传量有限) 通过鼠标单击,在File标签中选择的文件,才能上传. 2.通过AJAX实现文件上传:禁用方式   AJAX的数据传递通过javascript脚本取值.如果传递文件,那么也需要通过javascript脚本获取文件内

springmvc和servlet下的文件上传和下载(存文件目录和存数据库Blob两种方式)

项目中涉及了文件的上传和下载,以前在struts2下做过,今天又用springmvc做了一遍,发现springmvc封装的特别好,基本不用几行代码就完成了,下面把代码贴出来: FileUpAndDown.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"%> <html> <head> <title>using commons Uplo

struts2中的文件上传和下载

天下大事,必做于细.天下难事,必作于易. 曾经见过某些人,基础的知识还不扎实就去学习更难的事,这样必然在学习新的知识会很迷惑结果 再回来重新学习一下没有搞懂的知识,这必然会导致学习效率的下降!我写的这篇上传和下载都很基础. 十分适合初学者! jsp:页面 <!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data, 不然就会以二进制文本上传到服务器端--> <for

JavaWeb文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请 求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common- fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,st