统计
  • 建站日期:2021-03-10
  • 文章总数:518 篇
  • 评论总数:151 条
  • 分类总数:32 个
  • 最后更新:4月20日
文章 springmvc

传统文件上传,Springmvc文件上传,跨服务器文件上传,所需要的jar

梦幻书涯
首页 springmvc 正文

package com.sise.controller;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.List;
import java.util.UUID;

@Controller
@RequestMapping("/fileUploadController")
public class FileUploadController {


    /*
     * 跨服务器文件上传方式
     * 用到的jar包
     *
     *     <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.18.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
      <version>1.18.1</version>
    </dependency>
    *
    *
     *
     **步揍就是
     * 表单提交的请求(Request)---->前端控制器(DispatcherServlet)
     * --->文件解析器(CommonsMultipartResolver)将表单请求的数据
     *解析到一个(MultipartFile)upload对象--->前端控制器(DispatcherServlet)
     * ---->再给控制器的办法上接受文件解析器传的对象
     * testSpringmvcFL(HttpServletRequest request,  MultipartFile upload){}
     * 就可以利用这个对象上传文件了
     * */
    @RequestMapping("/testKuaFWQ")
    public String testKuaFWQ(MultipartFile upload) throws Exception {

        String path="http://123456.465.465";
        /*
        File file = new File(path);
        if (!file.exists()){
            file.mkdirs();
        }*/
        String filename = upload.getOriginalFilename();
        filename= UUID.randomUUID().toString().replace("-","")+"_"+filename;
        upload.transferTo(new File(path,filename));

        // 创建客户端的对象
        Client client = Client.create();

        // 和图片服务器进行连接
        WebResource webResource = client.resource(path + filename);

        // 上传文件
        webResource.put(upload.getBytes());

        return "success";
    }

 

 

 

 

    /*
    * Springmvc文件上传方式
    *步揍就是
    * 表单提交的请求(Request)---->前端控制器(DispatcherServlet)
    * --->文件解析器(CommonsMultipartResolver)将表单请求的数据
    *解析到一个(MultipartFile)upload对象--->前端控制器(DispatcherServlet)
    * ---->再给控制器的办法上接受文件解析器传的对象
    * testSpringmvcFL(HttpServletRequest request,  MultipartFile upload){}
    * 就可以利用这个对象上传文件了
    *
    * */
    public String testSpringmvcFL(HttpServletRequest request,  MultipartFile upload) throws Exception {
        String path = request.getSession().getServletContext().getRealPath("/WEB-INF/upload/");
        File file = new File(path);
        if (!file.exists()){
            file.mkdirs();
        }
        DiskFileItemFactory factory=new DiskFileItemFactory();
        ServletFileUpload uploadd=new ServletFileUpload(factory);
        List<FileItem> fileItems = uploadd.parseRequest(request);
        for (FileItem fileItem : fileItems) {
            if (fileItem.isFormField()){}
            else{
                String filename = UUID.randomUUID().toString().replace("-", "") + "_" + fileItem.getName();
                fileItem.write(new File(path,filename));
                fileItem.delete();
            }

        }
        // 说明上传文件项
        // 获取上传文件的名称
        String filename = upload.getOriginalFilename();
        /*
        * 等价于
        *         DiskFileItemFactory factory=new DiskFileItemFactory();
        ServletFileUpload uploadd=new ServletFileUpload(factory);
        List<FileItem> fileItems = uploadd.parseRequest(request);
        *         for (FileItem fileItem : fileItems) {
            if (!fileItem.isFormField()){

          }
           }
        * 也就是利用这个jar下的插件就可以直接拿到该上传的文件数据项,直接
        *       // 获取上传文件的名称
        String filename = upload.getOriginalFilename();就可以得到名称
        * 将文件写入该文件夹下并命名该文件名4
        * upload.transferTo(new File(path,filename));
        *
        * //fileItem.write(new File(path,filename));
        * */
        filename=UUID.randomUUID().toString().replace("-","")+"_"+filename;
        // 完成文件上传
        upload.transferTo(new File(path,filename));//fileItem.write(new File(path,filename));

        return "success";
    }

 

 

 

 

 

 

 

 

 

 

    /*
     * 传统文件上传方式
     * 如果配置了文件解析器,传统方式就上传不成功
     *  <!--配置文件解析器
   该解析器配置的id的名字必须是multipartResolver
   必须是这个,记住
   -->

    <!--配置文件解析器对象-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760" />
    </bean>
     *
     * */

    /*
    * 需要用到
    *     <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>
    * 这两个jar包
    *
    * */

 

    @RequestMapping("/fileUploadCT")
    public String fileUploadCT(HttpServletRequest request) throws Exception {
        /*
         * request.getSession().getServletContext()得到一个最大范围的tServletContext
         * 再用.getRealPath("/fileuploads/");就可以让文件存再这个目录下
         *
         * */
        System.out.println("文件上传...");
        String path = request.getSession().getServletContext().getRealPath("/fileuploads/");
        //将文件存在这个目录下
        File file = new File(path);

        //判断该目录存在不存在,否则就创建
        if (!file.exists()) {
            file.mkdirs();
        }

        //下面三步简单的说就是
        //创建磁盘文件项工厂用来封装数据和元素
        //将磁盘文件项工厂对象存入ServletFileUpload,就可以得到request数据
        //fileUpload.parseRequest(request);就可以得到请求的表单文件项
        DiskFileItemFactory fileItem = new DiskFileItemFactory();//这个是将表单上传的数据和元素封装再这个磁盘文件项工厂上
        ServletFileUpload fileUpload = new ServletFileUpload(fileItem);//用于解析request,解析出装有fileItem对象的一个list集合
        //fileItem:每个fileItem的文件项都一个文件以及该文件的其他属性(文件名,大小)
        List<FileItem> items = fileUpload.parseRequest(request);
        int size = items.size();
        System.out.println(size);
        for (FileItem item : items) {
            if (item.isFormField()){
                //普通表单项(文字)不是传文件的
                System.out.println("通表单项(文字)不是传文件的");
               // item.getString();456546
                //item.getFieldName()-->username---->   <input type="text" name="username"><br>
            }else{
                //这个是上传文件的文件项
                System.out.println("这个是上传文件的文件项");
                String filename = item.getName();
                String uuid = UUID.randomUUID().toString().replace("-", "");
                filename = uuid+"_"+filename;
                // 完成文件上传
                item.write(new File(path,filename));
                // 删除临时文件
                item.delete();

            }
        }
        return "success";
    }


    /*
    * 这个也是传统文件上传方式
    *
    *
    * */
    @RequestMapping("/testCTfileUpload")
    public String testCTfileUpload(HttpServletRequest request) throws Exception {
        //存在WEB-INF下用户访问不到,提高安全性
        String path = request.getSession().getServletContext().getRealPath("/WEB-INF/upload/");
        File file = new File(path);
        if (!file.exists()){
            file.mkdirs();
        }
//创建磁盘文件项工厂
        DiskFileItemFactory factory=new DiskFileItemFactory();
        factory.setRepository(new File(request.getSession().getServletContext().getRealPath("/WEB-INF/temps/")));
        //上面这句话的意思,就是设置临时文件夹再/WEB-INF/temps/这里,当上传文件大于setSizeThreshold时,他就会放再临时目录中
        //往工厂里面添加一个文件上传解析器
        ServletFileUpload upload=new ServletFileUpload(factory);
        //解决上传文件名中文乱码问题
        upload.setHeaderEncoding("UTF-8");
        upload.setFileSizeMax(1024*1024*10);//1M大小,表示一个文件大小不大于1M
        upload.setSizeMax(1024*1024*30);//表单能从这个表单传3M大小的文件过来,是全部=多个上传的文件大小总和

        //使用文件上传解析器解析表单数据,从而得到多个文件项
        List<FileItem> items = upload.parseRequest(request);
        //表示提交上来的数据是否是上传表单的数据
        if (!ServletFileUpload.isMultipartContent(request)){
            System.out.println("该数据不是从表单传过来的");
        }
        for (FileItem item : items) {
            if (item.isFormField()){
                //普通项,也就是非<input type="file" name="upload" /><br/>
                //非  type="file"
            }else{
                String filename = UUID.randomUUID().toString().replace("-", "") + "_" + item.getName();
                item.write(new File(path,filename));
                //当上传文件大小超过限制时,他就会它超过的部分放在临时文件目录中,因此需要删除
                item.delete();
            }
        }
        return "success";
    }
}

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

这篇文章最后更新于2020-8-9,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
springmvc拦截器,异常处理机制,已经拦截器配置,异常处理的配置
« 上一篇
SpringMvc请求转发,重定向,ModelAndView,JSon数据的响应,和ajax的使用,以及Springmvc.xml配置
下一篇 »

发表评论

HI ! 请登录
注册会员,享受下载全站资源特权。
Array

日历

热门文章