Grazie infinite!
Eccomi tornato sull’esercitazione dopo un’altra interruzione.
Rivedendo la seconda parte dell’esercitazione, quella sull’upload dei file, ho queste domande:
application.properties
1) Il programmatore imposta “
spring.messages.cache-duration=-1” perché nel pom.xml usa “
spring-boot-devtools” e vuole che durante lo sviluppo il contenuto di “
messages.properties” non venga cancellato dalla cache? Se sì quale sarebbe l’utilità di questa pratica? Perché usare “
spring-boot-devtools” per poi disabilitare la cache? Ma soprattutto perché disabilitare la cache quando questi script vengono usati principalmente in fase di test?
Il bundle di cui si parla a questo indirizzo:
https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
sarebbe il file “
messages.properties”, giusto? Si parla spesso di bundle ma non ne comprendo a fondo il significato nei vari contesti.
2) ‘
spring.servlet.multipart.file-size-threshold=5MB’ a cosa serve? Non capisco la definizione della proprietà che trovo sul sito.
3) Perché l’autore scrive ‘
spring.servlet.multipart.max-request-size=100MB’ quando nell’HTML manca persino ‘multiple’ nel tag input ‘
<!--<input type="file" name="myFile" multiple/>’? Leggendo FileUploadController.java non mi sembra che il programmatore abbia pensato ad un upload multiplo, il codice mi è abbastanza chiaro.
fileUpload.html
4) Perché ci sono 2 action?
<form action="uploadMyFile" th:action="@{/uploadMyFile}" method="post" enctype="multipart/form-data">
5) enctype="multipart/form-data" è il tipo di codifica che richiedono i metodi di Spring Boot per gestire l’upload dei file dal browser?
FileUploadController.java
byte[] bytes = file.getBytes();
Il comando sopra dovrebbe convertire un file in una sequenza di byte. 1 byte è uguale ad 8 bit, quindi significa che l’array, al posto di numeri o stringhe, ha dei raggruppamenti di 1 e 0. Concettualmente è una successione di numeri compresi tra 0 e 255 espressi in linguaggio macchina (linguaggio binario).
E’ giusto quello che scrivo?
Upload di un file di 2GB:
6) Se cerco di caricare un file di 600MB funziona tutto alla perfezione anche se mi sembra tutto quanto un po’ lento ma se provo a caricare un file di 9GB ottengo questo errore:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri Oct 09 22:57:51 CEST 2020
There was an unexpected error (type=Internal Server Error, status=500).
Java heap space
Come risolvo?
WebConfig.java
((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
application.properties
spring.servlet.multipart.max-file-size=10240MB
spring.servlet.multipart.max-request-size=40960MB
IntelliJ
-Xms128m
-Xmx18192m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf
JAVA
C:\Program Files\Java\jre1.8.0_261\bin
1.png
7) Se si vuole permettere l’upload solo ad utenti autenticati come potrei fare? Ho editato
FileUploadController.java nel modo seguente ma credo che sia sbagliato perché
!userRepository.findAll().isEmpty() cerca nel
DBMS e non nel
model, quindi come devo procedere per capire se c’è un utente autenticato?
@Autowired
private UserRepository userRepository;
...
@RequestMapping(value = "/uploadMyFile", method = RequestMethod.POST)
public String handleFileUpload(@RequestParam("myFile") MultipartFile file,
RedirectAttributes redirectAtttributes) {
if (!file.isEmpty() && !userRepository.findAll().isEmpty()) {
String name = file.getOriginalFilename();
...
HomeController.java
@RequestMapping(value="/login", method=RequestMethod.POST)
public String login(User user, Model model) {
System.out.println("Parametri dell'utente inseriti nel form: " + user);
String passwordDigitata = user.getPassword();
User savedUser = userRepository.findUserByEmail(user.getEmail());
String passwordDBMS = savedUser.getPassword();
if(passwordDigitata.equals(passwordDBMS)){
model.addAttribute("user", savedUser);
System.out.println("Utente trovato nel DBMS ed aggiunto alla sessione: " + savedUser);
} else {
System.out.println("Utente non presente a database o credenziali errate.");
return "redirect:/login";
}
return "redirect:/";
}