利用Java实现(单文件上传、多文件上传和文件下载)功能和如何将其运用到实际项目中

一、文件上传步骤

1、创建jsp页面

在这里插入图片描述

2、创建控制器类

在这里插入图片描述

1、这里定义了浏览器中访问的路径为http://localhost:8080/smv/up
2、并在springmvc配置文件中定义了视图解析器

3、在springmvc配置文件中定义图片上传的bean对象

在这里插入图片描述

4、在tomcat的webapps目录下创建存放图片上传的文件夹

在这里插入图片描述

5、在控制器类中创建jsp页面Post提交方式的对应处理方法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

修改:里面的路径修改为D:\Tomcat9\tomcat9.0\webapps\imgs\7.jpg

6、在jsp页面中通过< img >标签来显示webapps文件目录下的图片

在这里插入图片描述

7、通过request对象来获取webapps目录,使得代码更加灵活

在这里插入图片描述

8、因为上传的图片格式和文件名不可能都是一样,所以代码做如下改进

在这里插入图片描述

9、当jsp页面中没有点击上传图片时,则会报错,因为并没有判断上传图片是否为空

在这里插入图片描述

10、在实际开发中不可能特意跑去tomcat目录下的webapps文件夹下再创建一个专门存放图片的子文件夹

在这里插入图片描述

11、完整代码:

项目的目录结构图:
在这里插入图片描述

UploadController.java

@Controller
public class UploadController {

    @RequestMapping(value = "/up",method = RequestMethod.GET)
    public String uploadFile(){
        return "upload";
    }

    @RequestMapping(value = "/up",method = RequestMethod.POST)
    public String uploadFile(@RequestParam(value = "file",required = false)MultipartFile file
    , HttpServletRequest request, ModelMap model) throws IOException {
        String webapps = null;
        String fileName = null;
        if (!file.isEmpty()) {
            String realPath = request.getServletContext().getRealPath("/");
            System.out.println("工程目录:"+realPath);//工程目录:D:\Tomcat9\tomcat9.0\webapps\uploadFile\
            webapps = new File(realPath).getParent();
            System.out.println("webapps目录:"+webapps);//D:\Tomcat9\tomcat9.0\webapps
            //将文件名最后一个'.'的位置开始裁剪,把文件后缀名裁剪出来
            String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            System.out.println("图片后缀名:" + ext);
            //图片名
            fileName = file.getOriginalFilename();
            System.out.println("图片名:"+ fileName);
            //产生随机图片名
            //String imgname = UUID.randomUUID().toString()+".jpg";
            String imgname = UUID.randomUUID().toString() + ext;




            //先判断/imgs/文件是否存在,没有则自动创建/imgs/文件夹
            if (new File(webapps+"/imgs/").exists() == false){
                new File(webapps+"/imgs/").mkdirs();
            }
            file.transferTo(new File(webapps + "\\imgs\\" + imgname));
        }
        model.put("fileUrl",webapps+"/imgs/"+ fileName);
        model.put("fileName",fileName);
        return "show";
    }
}

upload.jsp

<form action="/uploadFile/up" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="file"><br/><br/>
    <input type="submit" value="上传"><br/>

</form>

show.jsp

<body>
文件上传成功!<br>
上传文件的路径:${requestScope.fileUrl}<br>
<a href="fileDownload?fileName=${requestScope.fileName}">${requestScope.fileName }</a>

</body>

springmvc.xml

<mvc:annotation-driven/>

    <!-- 配置自动扫描的基包 -->
    <context:component-scan base-package="com.hcz.controller"/>

    <!-- 配置视图解析器,将控制器方法返回的逻辑视图解析为物理视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <!-- <property name="prefix" value="/ch06/"></property> -->
        <property name="prefix" value="/WEB-INF/show/" />
        <property name="suffix" value=".jsp"></property>
    </bean>

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 上传文件的最大尺寸为10MB -->
        <property name="maxUploadSize" value="10485760"/>
        <!-- 字符编码 -->
        <property name="defaultEncoding" value="UTF-8"/>

    </bean>

web.xml

<!-- 配置Spring MVC的前端控制器DispatcherServlet -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 初始化参数,配置Spring MVC配置文件的位置以及名称 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 表示容器启动时,立即加载dispatcherServlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- Spring MVC的前端控制器拦截所有的请求 -->
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

二、文件下载

只需在控制器类中添加以下方法即可

	/**
     * 文件下载
     */
    @RequestMapping(value="/fileDownload")
    public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
      @RequestParam("fileName") String fileName) throws Exception {

        //下载文件路径
        String realPath = request.getServletContext().getRealPath("/");
        System.out.println("工程目录:"+realPath);
        String webapps = new File(realPath).getParent();
        //创建文件对象
        File file=new File(webapps + "//imgs//" +fileName);
        //设置相应头
        HttpHeaders headers=new HttpHeaders();
        //下载显示的文件名,解决中文名乱码问题
        String downloadFileName=new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
        //通知浏览器以下载方式(attachment)打开文件
        headers.setContentDispositionFormData("attachment", downloadFileName);
        //定义以二进制流的形式下载返回的文件数据
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        //使用Spring MVC框架的ResponseEntity对象封装返回下载的数据
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);

    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、多文件上传

控制器类:UploadController . java

@Controller
public class UploadController {

    @RequestMapping(value = "/up",method = RequestMethod.GET)
    public String uploadFile(){
        return "upload";
    }

    @RequestMapping(value = "/up",method = RequestMethod.POST)
    public String uploadFile(@RequestParam("description") String description,
                             @RequestParam(value = "files",required = false) List<MultipartFile> files
    , HttpServletRequest request) throws IOException {
        String webapps = null;
        String fileName = null;
        if (!files.isEmpty()&&files.size()>0) {
            //循环输出上传的文件
            for (MultipartFile file : files){
                String realPath = request.getServletContext().getRealPath("/");
                System.out.println("工程目录:"+realPath);
                webapps = new File(realPath).getParent();
                System.out.println("webapps目录:"+webapps);//D:\Tomcat9\tomcat9.0\webapps
                //将文件名最后一个'.'的位置开始裁剪,把文件后缀名裁剪出来
                String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
                System.out.println("图片后缀名:" + ext);
                //图片名
                fileName = file.getOriginalFilename();
                System.out.println("图片名:"+ fileName);
                //产生随机图片名
                //String imgname = UUID.randomUUID().toString()+".jpg";
                String imgname = description + "_" +UUID.randomUUID().toString() + ext;


                //先判断/imgs/文件是否存在,没有则自动创建/imgs/文件夹
                if (new File(webapps+"/imgs/").exists() == false){
                    new File(webapps+"/imgs/").mkdirs();
                }
                file.transferTo(new File(webapps + "\\imgs\\" + imgname));
            }
            return "show";
        }
        return "error";
    }
}

upload.jsp

<body>
    <form action="/uploadMultipleFiles/up" method="post" enctype="multipart/form-data">
        文件描述:<input type="text" name="description"><br/><br/>
        选择文件:<input type="file" name="files" multiple="multiple"><br/><br/>
        <input type="submit" value="上传"><br/>

    </form>
</body>

error.jsp

<body>
    上传错误,请重新上传<br>
	<a href="/uploadMultipleFiles/up">返回上传页面</a>
</body>

在这里插入图片描述
在这里插入图片描述

四、如何将以上代码运用到项目中去呢?

1、在实际项目中需要用到上传图片功能的代码中传入MultipartFile、HttpServletRequest参数,并添加以下代码

在这里插入图片描述

2、为方便下面代码调用图片名参数,可将其提到 if 语句上面去定义

在这里插入图片描述

3、在jsp页面form表单中需要加入以下代码

在这里插入图片描述

4、在jsp页面中定义的参数要和处理该页面的方法传入的参数要一致

在这里插入图片描述

注意: 以下代码前面可能一开始定义的文件名和后面的不一致,但是以后面定义的参数名为主

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@烟雨倾城ゝ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值