用SmartUpload实现文件上传,下载,删除

1、什么是上传和下载?

数据上传是指客户端向服务器上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指的是客户端向服务器上传文件。即将保存在客户端的文件上传至服务器中的一个副本,保存到服务器中。
- 数据下载是指客户端从服务器上获取数据的过程。文件下载是数据下载的一种特例,指的是客户端从服务器下载文件,即将原来保存在服务器中的文件下载到客户端中一个副本保存。通常我们对服务器所发出的请求,大多数是文件下载请求,从服务器中下载文本、图片、声音、视频等文件,然后由客户端浏览器对这些文件进行解析后,才可能看到这些多媒体信息。
- 但是我们这里所说的文件下载,指的是文件从服务器下载到浏览器后,浏览器并不直接解析,而是以附件的形式保存到客户端中。
- 上传与下载的文件可以是文本文件、图片、声音、视频等各种类型。
b8f92803d83bf1eeb80b10fbce113a91.png

2、文件上传的实现:

a、上传时对表单的要求:
- 文件上传要求客户端表单提交特殊的请求–multipart请求,即包含多部分数据的请求。所以文件上传表单对于表单数据的编码类型要求,必须为multipart/form-data。即要为标签指定enctype属性值为“multipart/form-data”。(enctype,即encodingtype,编码类型。)
- 由于客户端上传文件的大小是不确定的,所以HTTP协议规定,文件上传的数据要存放于请求正文中,而不能够出现在url的地址栏中,因为地址栏中可以存放的数据量太小。也就是说,文件上传的表单,必须提交POST请求,而不能够提交GET请求。

这里介绍的是用jsp+servlet实现的;

jsp表单代码就不贴了,注意2点就行:
1、表单提交必须用post方式 (method=“post”)
2、设置表单enctype属性为”multipart/form-data”

上传

      //指定文件存放位置
      String filePath = "/images";//这里的斜杠表示项目根目录
      //创建文件夹对象(未真正创建文件夹)
      File file = new File(filePath);
      //如果指定路径文件夹不存在就创建一个文件夹
      if(!file.exists()) {
          file.mkdirs();
          /*file.createNewFile();//这里的文件对象创建时参数要加上file名*/     
      }
      //创建SmartUpload对象
      SmartUpload su = new SmartUpload();
      //初始化SmartUpload对象
      su.initialize(getServletConfig(),request,response);
      //设置上传文件的最大值
      su.setMaxFileSize(1024*1024*10);
      //设置上传文件的总最大值
      su.setTotalMaxFileSize(1024*1024*100);
      //设置允许上传文件类型
      su.setAllowedFilesList("jpg,gif,jpeg,png");
      try {
        //设置不允许上传的文件类型
        //su.setDeniedFilesList("rar,txt,mp4,mp3,zip");
        //上传
        su.upload();
        Files files = su.getFiles();
        com.jspsmart.upload.File file1;
        for(int i=0;i<files.getCount();i++ ) {
            file1 = files.getFile(i);

    //遍历上传的所有文件,设置文件名,这里用了自己写的一个工具类UniqueId生成唯一id作为图片的id文件名
         file1.saveAs(filePath+"/"+UniqueId.getId()+Math.random()+"."+file1.getFileExt());
        //保存文件到指定路径,返回上传了多少个文件
        //int n = su.save(filePath);
        //System.out.println("上传了"+n+"个文件");
        System.out.println(file1.getFieldName());//表单的name值
        System.out.println(file1.getFileName());//文件名
        System.out.println(file1.getSize());//文件大小
        System.out.println(file1.getFilePathName());//文件原始路径加文件名
        System.out.println(file1.getFileExt());//文件类型
        System.out.println("___________________________________");
        System.out.println("___________________________________");
        }
      } catch (Exception e) {
            e.printStackTrace();
            System.out.println("上传失败!");
            System.out.println(e.getMessage());
        }

(在Eclipse中,默认会把Web项目放到Eclipse的工作空间下的.metadata.plugins\org.eclipse.wst.server.core\tmp0(或者是tmp1)\wtpwebapps\下)
在这里可以找到你上传成功的文件

下载

//超级简单
String fileName = request.getParameter("fileName");
        SmartUpload su = new SmartUpload();//创建对象
        su.initialize(getServletConfig(), request, response);//初始化
        try {
            su.downloadFile("/images/"+fileName);//路径加文件名
            //su.setContentDisposition();
        } catch (SmartUploadException e) {
            e.printStackTrace();
        }

删除

        String filePath = "/images/115049-106.jpg" ;//所在的项目路径
        filePath = getServletContext().getRealPath(filePath);//获取真正路径
        System.out.println(filePath);
        // 在指定路径下创建指定名称的文件
        File file = new File(filePath);//获取文件
        file.delete();//删除

注意:

1,在上传的时候提交表单的时候如果input项有非file类型的,在servlet使用request的时候不能直接使用,而是要用su.getRequest()代替,su是SmartUpload对象,而且要在su初始化和调用upload()方法之后再使用。

2,在输入路径的时候,应用SmartUpload上传保存文件的时候可以用相对于项目的路径,如“/”+上传文件夹,而在创建文件夹要用硬盘真实路径,可以用getServletContext().getRealPath(filePath)获得,filePath指上面的相对于项目的路径。

3,不知道为什么用ajax无法和SmartUpload兼容,能访问servlet执行post方法但是执行SmartUpload的代码时有问题,可能是我自己的问题

开头部分参考资料:http://blog.51cto.com/12402717/1977293

猜你喜欢

转载自blog.csdn.net/qq_42862882/article/details/81457421