SpringBootアプリケーション内のstaticリソースへファイルをアップロードした場合は、アプリケーションを更新すると削除されるかと思います。
SpringBootは静的ファイルをWebアプリケーションの外へも設定できますので、まずはそこへの静的リソースパスを設定します。以下は設定例です。
application.yml
yml
1 spring :
2 resources :
3 static-locations :
4 - classpath : /static/
5 - file : /var/file/
この設定で、例えば http://localhost:8080/(ファイル名) で参照させたい場合は、/static/ 以下のファイル、ないしは /var/file/ 以下のファイルを自動的に探し出します。
あとはファイルアップロードの際に、 /var/file/ 以下へアップロードをすれば参照できます。
Controllerの実装:
java
1 import java . io . File ;
2 import java . io . FileOutputStream ;
3 import java . io . IOException ;
4 import java . io . InputStream ;
5
6 import org . apache . tomcat . util . http . fileupload . IOUtils ;
7 import org . springframework . stereotype . Controller ;
8 import org . springframework . validation . BindingResult ;
9 import org . springframework . web . bind . annotation . GetMapping ;
10 import org . springframework . web . bind . annotation . PostMapping ;
11 import org . springframework . web . bind . annotation . RequestMapping ;
12 import org . springframework . web . bind . annotation . RequestParam ;
13 import org . springframework . web . multipart . MultipartFile ;
14 import org . springframework . web . servlet . ModelAndView ;
15
16 @Controller
17 @RequestMapping ( "/upload" )
18 public class FileUploadController {
19 @PostMapping ( "upload" )
20 public ModelAndView upload ( @RequestParam ( "file" ) MultipartFile multipartFile , ModelAndView mnv , BindingResult result ) {
21
22 if ( result . hasErrors ( ) ) {
23 String message = result . getFieldError ( ) . getDefaultMessage ( ) ;
24 mnv . addObject ( "errorMessage" , message ) ;
25 mnv . setViewName ( "upload/index" ) ;
26 return mnv ;
27 }
28
29 if ( multipartFile . isEmpty ( ) ) {
30 String message = "ファイルがありません" ;
31 mnv . addObject ( "errorMessage" , message ) ;
32 mnv . setViewName ( "upload/index" ) ;
33 return mnv ;
34 }
35
36 try ( InputStream uploadStream = multipartFile . getInputStream ( ) ) {
37 String filename = multipartFile . getOriginalFilename ( ) ;
38 FileOutputStream fos = new FileOutputStream ( new File ( "/var/file/" + filename ) ) ;
39 IOUtils . copyLarge ( uploadStream , fos ) ;
40 mnv . addObject ( "uploadFileName" , filename ) ;
41 } catch ( IOException e ) {
42 log . warn ( "アップロード処理でエラーが発生しました" , e ) ;
43 String message = "アップロード処理が失敗しました" ;
44 mnv . addObject ( "errorMessage" , message ) ;
45 mnv . setViewName ( "upload/index" ) ;
46 return mnv ;
47 }
48
49 mnv . addObject ( "message" , "アップロードが完了しました" ) ;
50 mnv . setViewName ( "upload/index" ) ;
51 return mnv ;
52 }
53 }
アップロード画面の実装は以下のようになります。これも簡易的に、アップロード画面と、完了画面を同一にしています。
html
1 <! DOCTYPE html >
2 < html xmlns: th = " http://www.thymeleaf.org " >
3 < head >
4 < meta charset = " UTF-8 " />
5 < meta name = " viewport "
6 content = " width=device-width, initial-scale=1, shrink-to-fit=no " />
7 < title > Title </ title >
8 </ head >
9 < body >
10 < div class = " container " >
11 < div class = " alert alert-primary " role = " alert " th: if = " ${message} " th: text = " ${message} " > 通常メッセージ </ div >
12 < div class = " alert alert-warning " role = " alert " th: if = " ${errorMessage} " th: text = " ${errorMessage} " > エラーメッセージ </ div >
13 < form method = " post " th: action = " @{/upload/upload} " enctype = " multipart/form-data " >
14 < input type = " file " name = " file " >
15 < button type = " submit " class = " btn btn-primary " > アップロード機能を使う </ button >
16 </ form >
17 < img th: if = " ${uploadFileName} " th: src = " @{/{filename}(filename=${uploadFileName})} " width = " 320 " />
18 </ div >
19 </ body >
20 </ html >
SpringSecurityの設定は以下です。
最も簡易的なformログインの、ユーザ名user、パスワードpasswordでログインできるものです。
java
1 import org . springframework . context . annotation . Bean ;
2 import org . springframework . security . config . annotation . web . builders . HttpSecurity ;
3 import org . springframework . security . config . annotation . web . configuration . EnableWebSecurity ;
4 import org . springframework . security . config . annotation . web . configuration . WebSecurityConfigurerAdapter ;
5 import org . springframework . security . core . userdetails . User ;
6 import org . springframework . security . core . userdetails . UserDetails ;
7 import org . springframework . security . core . userdetails . UserDetailsService ;
8 import org . springframework . security . provisioning . InMemoryUserDetailsManager ;
9
10 13 15
16 @EnableWebSecurity
17 public class SecurityConfig extends WebSecurityConfigurerAdapter {
18 @Override
19 protected void configure ( HttpSecurity http ) throws Exception {
20
21 http . authorizeRequests (
22 ( authorize ) -> authorize
23 . antMatchers ( "/webjars/**" , "/index" , "/static/**" ) . permitAll ( )
24 . antMatchers ( "/upload/**" ) . hasRole ( "USER" )
25 ) . formLogin (
26 ( formLogin ) -> formLogin
27 . loginPage ( "/login" )
28 . failureUrl ( "/login-error" )
29 ) ;
30 }
31
32 @Bean
33 protected UserDetailsService userDetailsService ( ) {
34 UserDetails userDetails = User . withDefaultPasswordEncoder ( )
35 . username ( "user" )
36 . password ( "password" )
37 . roles ( "USER" )
38 . build ( ) ;
39 return new InMemoryUserDetailsManager ( userDetails ) ;
40 }
41 }
42
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/22 01:12 編集
2020/09/22 01:23 編集
2020/09/22 01:56
2020/09/22 02:30
2020/09/22 02:50 編集
2020/09/22 04:54
2020/09/22 05:55
2020/09/22 06:47
2020/09/22 07:16
2020/09/22 09:37
2020/09/22 09:54
2020/09/22 10:25
2020/09/22 10:45
2020/09/22 11:29
2020/09/22 13:06
2020/09/22 13:15
2020/09/22 13:26
2020/09/22 13:50
2020/09/22 13:54
2020/09/22 14:31
2020/09/22 15:30