2021-12-14春季学習


fileupdown (MultipartFile)


1.porm.xmlへの依存項目の追加
```
<!-- file upload -->
	<dependency>
commons-fileupload
commons-fileupload
1.4
  • servlet-context.xmlにbeanを追加

    idはmultipartResolverを使用する必要があります.ファイルアップロードに関連する他のスプリング
    参照して使用します.
  • web.xmlの設定
    最大10 MB
    multipartを処理するためにきっと!!設定します.
  • <!-- fileupload multipart-config maxSize set -->
    	<multipart-config>
            <max-file-size>104857600</max-file-size> <!-- 10MB limit -->
            <max-request-size>104857600</max-request-size>
            <file-size-threshold>0</file-size-threshold>
        </multipart-config>
        <!-- fileupload multipart-config -->
  • ファイルアップロード時に複数部分ファイルAPI
  • を使用
  • 主な方法:
  • getOriginalFilename()-ユーザーがアップロードしたファイル名
  • getSize()-ファイルサイズ(バイト)
  • getContentType()-ファイルコンテンツタイプ
  • getName()-inputtype=「file」のname属性で指定した値
  • ※アップロード処理は、ファイルオブジェクトの一部のTransferTo(File f)メソッド呼び出しのみで行います.
    1つ目の方法]パラメータとして複数のファイルを使用する
    ※まず空のプロファイルにCommonsMultipartResolver空を登録する
    複数のパラメータがある場合は、次のノイズを追加します.
    inputtype=file以外のパラメータを受け入れる
    com/kosmo/springapp/basic/e x ceptionControllerAddice付属@ResquestParam Map
    ※enctype="multipart/form-data" 일때
     Map은 input type="file"을 받지 못한다.
    또한 checkbox(여러개 선택해도) 는 하나만 받는다.
    
    
    
    아래 어노이션으로는 MaxUploadSizeExceededException예외 처리 불가
    @ControllerAddice.java
    クラス内での例外処理または
    現在のクラスに@ControllerAddiceを追加
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public String error(Model model,HttpServletRequest req) {
    model.addAttribute(「maxError」、「ファイルアップロード容量が超過」).
    return "fileupdown14/Upload";
    }
    @RequestMapping("/FileUpDown/Upload.do")
    public String Upload(@RequestParam Map,//他のパラメータを受信するために使用
    @RequestParamマルチセクションファイルアップロード、//type=file受信用
    HttpServiceletRequest req//サーバの物理パスの取得
    ) throws IllegalStateException, IOException{
    System.out.println(「タイトル(Map):」+map.get("title"));
    System.out.println(「ヘッダー」(HttpServeretRequest):"+req.getParameter("title"));
    	//1]서버의 물리적 경로 얻기		
    	String path=req.getServletContext().getRealPath("/upload");
    	//2]File객체 생성	
    	File dest = new File(path+File.separator+upload.getOriginalFilename());
    	//3]업로드 처리
    	upload.transferTo(dest);
    	//4]리퀘스트 영역에 데이타 저장
    	req.setAttribute("original", upload.getOriginalFilename());
    	req.setAttribute("real", upload.getOriginalFilename());
    	req.setAttribute("type", upload.getContentType());
    	req.setAttribute("size", (int)Math.ceil(upload.getSize()/1024.0));
    	return "fileupdown14/UploadComplete";
    第2の方法2]
    MultipartHttpServertRequestの使用
    マルチセクションHttpServertRequestは、マルチセクションファイルとHttpServertRequestを組み合わせたクラスです
    ※type="file"name="パラメータ名"を入力した場合getFile("パラメータ名")
    その他のパラメータ受信時にgetParameter(「パラメータ名」)を使用します.
    @RequestMapping("/FileUpDown/Upload.do")
    public String upload(@RequestParam Map map,MultipartHttpServletRequest mhsr) throws IllegalStateException, IOException{
    //1]サーバの物理パスの取得
    String path=mhsr.getServletContext().getRealPath("/upload");
    //1-1]HttpServeretRequestオブジェクトのgetFile(「パラメータ名」)
    複数のPartFileオブジェクトをメソッドで取得
    MultipartFile upload= mhsr.getFile("upload");
    //2]Fileオブジェクトの作成
    ///2-1]ファイル重複時の名前変更
    String rename=FileUpDownUtils.getNewFileName(path, upload.getOriginalFilename());
    File dest = new File(path+File.separator+rename);
    //3]アップロード処理
    upload.transferTo(dest);
    //4]要求領域にデータを保存する
    mhsr.setAttribute("original", upload.getOriginalFilename());
    mhsr.setAttribute("real", rename);
    mhsr.setAttribute("type", upload.getContentType());
    mhsr.setAttribute("size", (int)Math.ceil(upload.getSize()/1024.0));
    return "fileupdown14/UploadComplete";
    第3の方法]コマンドオブジェクト
  • を使用する.
    @RequestMapping(value="/FileUpDown/Upload.do",method=RequestMethod.POST)
    	public String upload(UploadCommand cmd,HttpServletRequest req) throws IllegalStateException, IOException{
    		//1]서버의 물리적 경로 얻기		
    		String path=req.getServletContext().getRealPath("/upload");
    		//1-1]MultipartHttpServletRequest객체의 getFile("파라미터명")
    메소드로 MultipartFile객체 얻기
    		MultipartFile upload= cmd.getUpload();
    		//2]File객체 생성	]
    		//2-1] 파일 중복시 이름 변경
    		String rename=FileUpDownUtils.getNewFileName(path, upload.getOriginalFilename());
    		File dest = new File(path+File.separator+rename);
    		//3]업로드 처리
    		upload.transferTo(dest);
    		//4]리퀘스트 영역에 데이타 저장
    		req.setAttribute("original", upload.getOriginalFilename());
    		req.setAttribute("real", rename);
    		req.setAttribute("type", upload.getContentType());
    		req.setAttribute("size", (int)Math.ceil(upload.getSize()/1024.0));
    		return "fileupdown14/UploadComplete";
    	}
    다운로드
    Springが提供するAPIは使用されていません
    戻りタイプ:voidダウンロード原理を適用してWebブラウザに直接出力
    @RequestMapping("/FileUpDown/Download.do")
    public void download(
    			HttpServletRequest req,
    			HttpServletResponse resp,@RequestParam String filename) {
    		
    		FileUpDownUtils.download(req, resp, filename, "/upload");
    }
    Spring API-を使用してタイプを返すにはString(文字列は空のプロファイルに登録するビューオブジェクトのid値)が必要です.
    public String download(Model model,HttpServletRequest req) {
    		컨트롤러 메소드에서는 다운로드할 파일을 모델에 저장만 하면됨]
    		File객체를 생성해서 모델계열에 저장만 하면	컨트롤러의 역할은 끝남.
    		즉 Model이나 Map이나 ModelMap으로만.
    		//1]파일 객체 생성
    		String path = req.getServletContext().getRealPath("/upload");
    		String filename = req.getParameter("filename");
    		File file= new File(path+File.separator+filename);
    		//2]모델에 파일객체 저장-다운로드 처리용 View객체의 메소드의  매개변수인 Map으로 전달됨
    		model.addAttribute("file", file);
    		return "downloadView";
    	}