2017-01-02 5 views
0

Ich arbeite an einem Image Manager System für mein Spring MVC Projekt, mit den grundlegenden Funktionen der Anzeige der Galerie aller im lokalen Bildordner gespeicherten Bilder, Löschen von Bildern und Hochladen neuer Bilder.Spring MVC Resources nicht erfrischend

Ich möchte, dass, sobald ein neues Bild hochgeladen wird, die Seite die Bildergalerie neu lädt, einschließlich des gerade hinzugefügten Bildes. Tatsächlich wird das neue Image korrekt auf der Festplatte gespeichert, aber es wird nicht automatisch im Ordner "resources/img" im Java-Projekt angezeigt. Wenn die Seite neu geladen wird, ist das neue Bild daher nicht vorhanden. Nur wenn ich das Projekt manuell aktualisiere, erscheint das neue Bild im Ordner resources/img. Die seltsame Sache ist, ich habe nicht das gleiche Problem mit der Löschmethode: Sobald ein Bild gelöscht wird, verschwindet es von der Festplatte und dem Ressourcen/img-Ordner, und die Seite lädt die Galerie neu, ohne das Bild zu zeigen gerade gelöscht.

Irgendeine Idee, wo das Problem sein könnte?

Hier ist mein Controller

@Controller 
public class imagesManagerController { 

// READ ALL FILES FROM IMG FOLDER 
@RequestMapping(value = "/imagesManager", method = RequestMethod.GET) 
public ModelAndView readImages 
(@RequestParam(value = "error", required = false) String error) { 

    // create model and link it to jsp imagesManager 
    ModelAndView model = new ModelAndView("imagesManager"); 

    // return content from images folder and add it to model 
    File imgsPath = new File("C:/Users/Alessandro/workspace/SpringMVCBlog/WebContent/resources/img"); 
    String[] imgsNames = imgsPath.list(); 
    model.addObject("imgsNames", imgsNames); 

    //if upload fails, display error message 
    if (error != null) { 
     model.addObject("error", 
       "Please select a file to upload"); 
    } 

    return model; 
} 




//UPLOAD FILE TO HD 
@RequestMapping(value = "/imagesManager/upload", method = RequestMethod.POST) 
public String handleFileUpload (@RequestParam("file") MultipartFile file) { 

    //get img name 
    String imgName = file.getOriginalFilename(); 
    System.out.println(imgName); 

    //create file path 
    String folder = "C:/Users/Alessandro/workspace/SpringMVCBlog/WebContent/resources/img/"; 
    File path = new File (folder+imgName); 
    System.out.println(path); 

    if (!file.isEmpty()) { 

     try { 
      //get bytes array from file 
      byte[] bytes = file.getBytes(); 

      //create output stream 
      BufferedOutputStream stream = new BufferedOutputStream(
        new FileOutputStream(path)); 

      //write img content on path 
      stream.write(bytes); 

      //close stream 
      stream.close(); 

      //if upload is successful, reload page 
      return "redirect:/imagesManager"; 

     } catch (Exception e) { 
      return "You failed to upload " + imgName + " => " + e.getMessage(); 
     } 

    } else { 
     return "redirect:/imagesManager?error"; 
    } 
} 


// DELETE FILE FROM HD 
@RequestMapping(value = "/imagesManager/delete", method = RequestMethod.POST) 
public String deleteFile(@RequestParam (value="imgName") String imgName) { 

    //create file path to be deleted 
    String folder = "C:/Users/Alessandro/workspace/SpringMVCBlog/WebContent/resources/img/"; 
    File path = new File (folder+imgName); 

    // delete file 
    if (path.delete()) { 
     //if delete is successful, reload page 
     return "redirect:/imagesManager"; 

    } else { 
     return "Delete operation failed"; 
    } 
} 

}

Antwort

1

Das Problem im Weg ist:

WebContent/resources/img 

es wahrscheinlich Server Auto-Deployment aufgrund IDE ist erfrischend. Testen Sie mit %TEMP% Pfad und überprüfen.

1) Sie sollten hochgeladene Dateien nicht im Dateisystem des Anwendungsservers speichern.

2) Sie sollten hochgeladene Dateien nicht im Anwendungsordner speichern, da dies Teil der Bereitstellung ist. Es wird nur einmal bereitgestellt und dieser Ordner ist nur für die Anwendungsdateien vorgesehen.

Verwenden Sie stattdessen die Cloud oder ein dediziertes Dateisystem.

+0

Ich möchte die hochgeladenen Dateien auf der lokalen Festplatte speichern. Sie meinen also, ich sollte sie nicht im IDE-Projektordner speichern, sondern irgendwo anders (z. B. C: \ Users \ Public \ Pictures)? –

+0

Korrekt. Für die Produktionsbereitstellung sollten Sie eine Cloud oder einen dedizierten Dateiserver verwenden. –

+0

Ok, aber wenn ich die Dateien nicht im IDE-Projektordner speichere, wie kann ich sie im Controller lesen? Bitte beachten Sie, dass ich die Dateien auf der lokalen Festplatte als jpg, nicht in der DB oder externen Server/Cloud speichern möchte. –