Spring Framework第11話-静的ファイル処理とファイルアップロード


学習内容

  • Static Webリソース処理
  • ファイルアップロード
  • 学習目標

  • Webサービス時の静的Webリソースの処理方法を理解します.
  • ファイルのアップロード方法を理解し、体現します.
  • せいてきしげんしょり


    Static Webリソースの処理

  • サーバ処理を必要としない静的Webリソースは、要求時にサーバを経由することなく
  • に応答する.
  • は、特定のURLを要求すると、それを静的リソースと見なし、直ちに
  • に応答する.
    これまで、動的リソースのみを学習し、実践してきました.リクエストが発行されると、サーバ側に到着し、さまざまなメソッドを呼び出して戻ります.
    ただし、サーバを処理する必要がなく、クライアントに直接応答するリクエストもあります.例えば、CSSファイルなど.これらのリクエストは静的リソースと呼ばれます.

    < mvc:resources mapping="/resources/**" location="/WEB-INF/resources" />

  • マッピング:HTTP要求URL
  • location:実際の応答ファイルを含む
  • 例)要求:http://localhost:8080/hello/resources/scripts/jQuery.js
    応答:/WEB-INF/resources/scripts/jQuery.js
  • Springはまた、静的リソースと動的リソースを分離し、静的リソースの応答速度を速める.上のラベルです.このタグを使用すると、Front-controller側は静的リソースを迅速に処理できます.
    上のラベルはservlet-contextです.xmlで作成すればいいです.
    このタグには2つのプロパティがあります.
    1)マッピング属性:URLパスを表します.
    すなわち,URLに/resourcesを追加すると,「これは静的リソース要求である」と考える.
    2)locationプロパティ:静的リソースへのディレクトリパス.

    ファイルのアップロード


    ファイルアップロード時のHTMLファイル

    <form method="post" enctype="multipart/form-data">
      ...
    </form>
    ファイルアップロード機能は、通常、HTMLのformタグを使用し、enctype値を「multipart/form-data」に格納します.

    複数部分サポート機能を使用するには、複数部分Resolverをスプリング設定として登録します。

  • マルチセクションResolverは、Spring MVCでデータを使用するためにencTypeをマルチセクション/フォームデータフォーマットに変換します.
  • <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    	<property name="maxUploadSize" value="104857600" /> <!-- 100MB -->
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

    ファイルをアップロードするには、DispatcherServicelet xmlファイルにbeanとして登録する必要があります.
    また、多くのプロパティを設定することもできます.

    依存項目の追加

  • CommonsMultipartResolver Apache Commons FileUploadを使用
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <form method="post" enctype="multipart/form-data" action="/bbs/upload">
      <input type="text" name="name"/>
      <input type="file" name="file" />
      <input type="submit" value="전송" />
    </form>
    依存項目も追加する必要があります.
    HTMLを記入する場合は、入力タグタイプの値を「file」と書くだけです.

    Controller File Upload Logicの追加

    @RequestMapping("/upload")
    public String doUpload(@RequestParam("name") String name, @RequestParam("file") MultipartFile file, Model model){
    	if(!file.isEmpty()){
        	File.tmpFile = new File("c:\\", file.getOriginalFilename());
            file.transferTo(tmpFile);
        }
        Model.addAttribute("fileNamek", name);
        return "upload_ok";
    }
    Webからファイルを受信する場合、JavaはMultipartFileというファイルデータを受信することができます.
    その後、transferTo()を使用してファイルシステムにファイルを保存します.
    これにより、実際にファイルのアップロードが実現されます.

    マルチセクションファイルの主な方法



    Commandオブジェクトとして受信

  • の一般的なHttpServertRequestと同様に、複数のファイルをCommandオブジェクトとして受信することもできます.
  • メンバー変数のタイプは、複数のファイルとして宣言する必要があります.
  • public class UploadCommand{
    	private String name;
        private MultipartFile file;
        //
        public String getName(){
        	return this.name;
        }
        public void setName(String name){
        	this.name = name;
        }
        public MultipartFile getFile(){
        	return this.file;
        }
        public void setFile(MultipartFile file){
        	this.file = file;
        }
    }
    HTMLからデータを受信する場合、ファイルデータはCommandオブジェクトとして受信することもできます.まずドメインオブジェクト(VO)を定義します.
    @ReqeustMapping("/doUpload")
    public ModelAndView doUpload(UploadCommand command) throws IllegalStateException, IOExption{
    	MultipartFile uploadedFile = command.getFile();
        if(!uploadedFile.isEmpty()){
        	File file = new File("c:\\", uploadedFile.getOriginalFilename());
            uploadedFile.transferTo();	//실제 저장
        }
        ModelAndView view = new ModelAndView();
        view.setViewName("test/fileUpload");
        return view;
    }

    ファイル保存時のセキュリティ

  • でアップロードされたファイル名を使用して保存すると、以降のファイルのダウンロードやセキュリティに問題が発生します.
  • のため、以下のようにファイル名が非表示になり、実際のファイル名が乱順化されて格納される.
  • は、ファイル名と実際のファイル名がデータベースに格納されているアイテムであることを示します.
  • の例です.画面にOracleが表示されます.exeファイルをダウンロードするには、リクエストファイルの実際の名前「1892174811234781872」が必要です.
  • String fileRandomName = UUID.randomUUID().toString();

  • ファイル命名方法
  • 重複できない数字
  • 実際のファイル名を乱す関数です.

    実習


    1.静的リソースの処理


    /bbsリクエスト時、index.jspファイルを静的リソースとして配布する実践.

    ↑URLリクエスト着信時index.jspをパブリッシュできる方法を作成します.

    ↑ index.jspを作成し、画像ファイルとcssファイルを追加します.

    ↑HTMLページが表示されますが、写真やCSSファイルは適用されていないようです.
    静的リソースが登録されていないため

    ↑ servlet-context.xmlにタグを追加します.
    このオプションを有効にすると、要求が受信されると、DispatcherServicelet(=frontcontroller)はコントローラを検索しません.要求は静的リソース要求なので、すぐに検索してパスに戻ります.

    ↑xmlを変更して再度リクエストを送信した場合の結果.
    写真の出力が正しい.CSSファイルは見えないが、padding設定がいくつか見られるはずだ.

    2.ファイルのアップロード



    ↑ Servlet-context.DispatcherServiceletプロファイル(xml)にBEANを登録します.
    class属性値「CMR」を打ってCTRL+space barを押すと出てきます~

    ↑ pom.xml(Mavenプロジェクト設定ファイル)からcommons-fileuploadライブラリを追加します.
    ファイルの場所はプロジェクトのルートディレクトリにあります~

    ↑コントローラをもう1つ作成してコードを書きます.

    ↑お願いします.

    ↑OKアップロードに成功しました.jspが表示されます.

    ↑Controllerで作成したファイル格納パス(「C:upload」)に入ると、ファイルは実際に保存されます.