Bonjour, je suis nouveau sur l'utilisation de Spring-Boot, Thymeleaf et Hibernate.
ça semble simple à priori...
Je veux télécharger un fichier vidéo (jusqu'à plusieurs Mo), le stocker dans un dossier sur le serveur de manière pérenne (une entité est créée parallèlement avec son nom éventuellement modifié, et son extension), et l'afficher côté client avec Thymeleaf.

En vérité, j'ai vu beaucoup d'exemple de upload de fichiers vers un dossier temporaires, ou directement, pour des images, vers la base de donnée, j'ai vu des exemples de sites e-commerce où on partait de fichiers images existant dans le class-path pour les afficher vers Thymeleaf, mais je n'ai pas trouvé une réponse globale à l'ensemble : le problème n'est donc pas aussi simple qu'il y parait...

Quelle est est la bonne solution pour y parvenir ?

J'ai trouvé une réponse qui semblait marcher :
J'ai dans mon service StorageService :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Service
public class StorageServiceImpl implements StorageService {
        private final String storageLocation = this.getClass().getResource("/static/").getPath();
	@Override
	public String store(MultipartFile file) {
		try {
			        File dir = new File(storageLocation + File.separator + "upload-storage");
			        if (!dir.exists()) {
			            dir.mkdirs();
			        }	
			        File serverFile = new File(dir.getAbsolutePath() + File.separator + fileNameTarget);
			            try {
			                try (InputStream is = file.getInputStream(); 
			                	BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile))
			                	) {
			                    int i;
			                    while ((i = is.read()) != -1) {
			                        stream.write(i);
			                    }
			                    stream.flush();
			                }
			            } catch (IOException e) {
			                System.out.println("error : " + e.getMessage());
			            }				
				}
				return fileNameTarget;
        } catch (Exception e) {
        	throw new RuntimeException("FAIL!");
        }
...et dans mon controller :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Controller
public class UploadController extends BaseController {	
        private final StorageService storageServiceImpl;
[...]
	@Autowired
        public UploadController(StorageService storageServiceImpl) {
        this.storageServiceImpl = storageServiceImpl;
        }
	@PostMapping("/upload")
	public String recupereUpload(
			@RequestParam("file") MultipartFile file, Model model, HttpServletRequest request) {
	try {		
                filename = storageServiceImpl.store(file);
                model.addAttribute(PARAM_BASE_URL, getBaseURL(request));
	        model.addAttribute("filename", filename);
		model.addAttribute("message", "Le téléchargement de " + filename+
					" est réussi ! ( taille ="+file.getSize()+" octets" );
		} catch (Exception e) {
			model.addAttribute("message", "FAIL to upload " + filename + "!");
		}
       [...]
	return "elementVideo/videoForm";
    }
Le BaseController me permet de gérer mon url :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
public class BaseController {
    public static final String PARAM_BASE_URL = "baseURL";
 
    public String getBaseURL(HttpServletRequest request){
        return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
    }
}
... Tout fonctionne bien :
Dans ma page html, ma vidéo s'affiche avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<video id="video" th:src="${baseURL}+'/upload-storage/'+${filename}" height="60" autoplay="autoplay"></video>
Mais curieusement (?), mes fichiers sont stockés dans un dossier <racine du projet>target/classes/static/upload-storage

et l'embêtant, c'est que ce dossier est vidé au bout de quelques jours sans avoir pu comprendre la raison...

Voilà... Merci de votre aide !