[SpringMVC] 파일 업로드 및 다운로드, JREBEL 활용

목차

I. 소개

2. 파일 업로드

1. 단일 파일 업로드

1.1 데이터 테이블 준비

1.2 종속성 추가

1.3 구성 파일

1.4 양식 작성

1.5 컨트롤러 레이어 작성

2. 다중 파일 업로드

2.1.양식 작성

2.2 컨트롤러 레이어 작성

2.3 테스트

3. 파일 다운로드

4. JREBEL의 이용

1. 다운로드 및 등록

2. 오프라인 설정


I. 소개

파일 업로드 및 다운로드를 사용하는 이유는 무엇입니까? 효과?

SpringMVC 파일 업로드 및 다운로드는 사용자가 서버에 파일을 업로드하거나 서버에서 파일을 다운로드할 수 있는 공통 기능 입니다. 이는 온라인 스토리지, 문서 관리 시스템 등과 같은 많은 웹 애플리케이션에 필수적인 기능입니다. SpringMVC는 파일 업로드 및 다운로드를 매우 간단하게 만드는 몇 가지 편리한 주석과 API를 제공합니다. 파일 업로드 측면에서 SpringMVC는 업로드된 파일을 쉽게 처리할 수 있도록 @RequestParam 주석과 MultipartFile 클래스를 제공합니다. 파일 다운로드 측면에서 SpringMVC는 클라이언트에 응답으로 파일을 보낼 수 있는 ResponseEntity 클래스를 제공합니다.

2. 파일 업로드

1. 단일 파일 업로드

1.1 데이터 테이블 준비

자신의 테이블에 맞게 활용하는 것도 가능하며, 단지 데이터를 저장하는 용도로만 사용됩니다.

1.2 종속성 추가

Spring MVC의 pom.xml에 파일 업로드 종속성을 추가하세요.

<dependencies>        
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>${commons-fileupload.version}</version>
        </dependency>
</dependencies>

1.3 구성 파일

자신의 spring-mvc.xml 파일 에 구성 추가

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
    <property name="defaultEncoding" value="UTF-8"></property>
    <!-- 文件最大大小(字节) 1024*1024*50=50M-->
    <property name="maxUploadSize" value="52428800"></property>
    <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
    <property name="resolveLazily" value="true"/>
</bean>

아래에는 파일 구성이 제공됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-4.3.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--1) 扫描com.tgq及子子孙孙包下的控制器(扫描范围过大,耗时)-->
    <context:component-scan base-package="com.tgq"/>

    <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
    <mvc:annotation-driven/>

    <!--3) 创建ViewResolver视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--4) 单独处理图片、样式、js等资源 -->
    <!--        <mvc:resources location="/static/" mapping="/static/**"/>-->
    <!--    处理文件上传下载问题-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 文件最大大小(字节) 1024*1024*50=50M-->
        <property name="maxUploadSize" value="52428800"></property>
        <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
        <property name="resolveLazily" value="true"/>
    </bean>
    <!--  处理controller层发送请求到biz,会经过切面的拦截处理  -->
    <aop:aspectj-autoproxy/>
</beans>

1.4 양식 작성

양식 제출 방법은 method="post"enctype="multipart/form-data" 입니다.

<%--
  Created by IntelliJ IDEA.
  User: tgq
  Date: 9/9/2023
  Time: 下午2:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>图片上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/sc/upload" method="post" enctype="multipart/form-data">
    <label>编号:</label><input type="text" name="cid" readonly="readonly" value="${param.cid}"/><br/>
    <label>图片:</label><input type="file" name="zx"/><br/>
    <input type="submit" value="上传图片"/>
</form>
</body>
</html>

업로드된 이미지의 이름은 데이터베이스 테이블 의 컬럼 이름과 동일 할 수 없으며 , 백엔드 코드의 이름과 동일해야 합니다 .

1.5 컨트롤러 레이어 작성

@Controller
@RequestMapping("/sc")
public class StrutsClasController {

    @Autowired
    private StrutsClasBiz strutsClasBiz;

 /**
     * 文件上传
     * <p>
     * //     * @param req
     * //     * @param strutsClas
     *
     * @param zx
     * @return
     */
    @RequestMapping(value = "/upload")
    public String upload(StrutsClas strutsClas, MultipartFile zx) {
//    public String upload(HttpServletRequest req, StrutsClas strutsClas, MultipartFile pic) {
        try {
            //思路:
            //1) 将上传图片保存到服务器中的指定位置
//            本地保存地址
//            String dir = PropertiesUtil.getValue("dir");
              String dir="d:/";
//            网络保存地址/upload/
//            String server = PropertiesUtil.getValue("server");
              String server="/upload/";
//            文件名
            String filename = zx.getOriginalFilename();
//            System.out.println("文件名:" + filename);
//            文件类别
//            System.out.println("文件类别" + zx.getContentType());
            System.out.println(strutsClas);
            FileUtils.copyInputStreamToFile(zx.getInputStream(), new File(dir + filename));
            //2) 更新数据库表t_struts_class图片记录
            strutsClas.setPic(server + filename);
            strutsClasBiz.updateByPrimaryKeySelective(strutsClas);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }
}

Tomcat을 구성할 때 업로드 주소 매핑을 추가하는 것을 잊지 마세요.

2. 다중 파일 업로드

2.1.양식 작성

<form method="post" action="/sc/uploads" enctype="multipart/form-data">
    <input type="file" name="files" multiple>
    <button type="submit">上传</button>
</form>

2.2 컨트롤러 레이어 작성

 /**
     * 多文件上传
     *
     * @param req
     * @param clas
     * @param files
     * @return
     */
    @RequestMapping("/uploads")
    public String uploads(HttpServletRequest req,MultipartFile[] files) {
        try {
            StringBuffer sb = new StringBuffer();
            for (MultipartFile cfile : files) {
                //思路:
                //1) 将上传图片保存到服务器中的指定位置
                String dir = "D:/temp/upload/";
                String server = "/upload/";
                String filename = cfile.getOriginalFilename();
                FileUtils.copyInputStreamToFile(cfile.getInputStream(), new File(dir + filename));
                sb.append(filename).append(",");
            }
            System.out.println(sb.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }

2.3 테스트

그러나 업로드할 파일을 여러 개 선택하면

로컬 파일이 비어 있습니다.


업로드하면 로컬로 업로드됩니다.

우리 데이터베이스에도 동일하게 적용됩니다

3. 파일 다운로드

자신의 테이블에 따라 작동

<a href="${pageContext.request.contextPath }/sc/download?cid=${b.cid}">下载图片</a>

컨트롤러 레이어 메소드 작성

/**
     * 文件下载
     *
     * @param strutsClas
     * @param req
     * @return
     */
    @RequestMapping(value = "/download")
    public ResponseEntity<byte[]> download(StrutsClas strutsClas, HttpServletRequest req) {

        try {
            //先根据文件id查询对应图片信息
            StrutsClas strutsClas1 = this.strutsClasBiz.selectByPrimaryKey(strutsClas.getCid());
//需要下载的地址
            String diskPath = PropertiesUtil.getValue("dir");
//服务器里面保存图片的地址
            String reqPath = PropertiesUtil.getValue("server");
            String realPath = strutsClas1.getPic().replace(reqPath, diskPath);
            String fileName = realPath.substring(realPath.lastIndexOf("/") + 1);
            //下载关键代码
            File file = new File(realPath);
            HttpHeaders headers = new HttpHeaders();//http头信息
            String downloadFileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");//设置编码
            headers.setContentDispositionFormData("attachment", downloadFileName);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

다운로드를 클릭하면 다운로드됩니다.

4. JREBEL의 이용

1. 다운로드 및 등록

플러그인 JRebel을 검색 하여 다운로드하세요. 설치가 성공적으로 완료되면 다시 시작하라는 메시지가 표시됩니다. 다시 시작한 후 작동 버튼을 누르세요.

팝업창에서 회원가입

첫 번째 항목에  http://127.0.0.1:8888/GUID를 입력하세요.   

GUID: GUID로 변경 하고 온라인 erstellen   에서 생성된 ID를 입력하세요.

등록 최종 확인

에이전트를 시작하세요. 그런 다음 JRebel을 실행하십시오.

2. 오프라인 설정

설정을 입력하세요. 전제는 이 작업을 수행하려면 에이전트를 시작해야 한다는 것입니다.

추천

출처blog.csdn.net/weixin_74383330/article/details/132776908