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
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:/";
}