【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 ファイルのアップロードとダウンロードは共通機能であり、ユーザーはサーバーにファイルをアップロードしたり、サーバーからファイルをダウンロードしたりできます。これは、オンライン ストレージ、ドキュメント管理システムなど、多くの Web アプリケーションにとって不可欠な機能です。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