2015-10-15 2 views
2

J'essaie de créer une application Web dans laquelle vous pouvez télécharger une image enregistrée dans mon système de fichiers, puis diffusée à l'utilisateur adresse (un peu comme imgur).Traitement de fichiers à l'aide de Spring-Boot et de Spring-MVC à partir de n'importe quel emplacement du système de fichiers

J'ai eu des problèmes avec le service des images après qu'elles aient été téléchargées et enregistrées dans mon système. On m'a fait remarquer que le problème pourrait être que je stocke les images dans l'arborescence des sources alors que je devrais les stocker dans le dossier cible de mes projets. Maintenant, la raison pour laquelle je stocke mes images dans le projet/src/main/resources/static/images en premier lieu est parce que je ne pouvais pas servir de contenu statique sur mon site d'un autre endroit.

J'ai recherché et lu sur ceci pendant quelques jours maintenant et je n'ai trouvé aucune solution applicable. Les réponses à ce genre de problèmes impliquent généralement des fichiers que mon projet n'a pas (comme application-servlet.xml ou web.xml) et que je n'ai jamais utilisé auparavant (je suis très nouveau sur Spring, Spring-Boot et Développement web Java en général).

La base de mon projet a été faite par un tuteur sur github que j'ai ensuite cloné, y compris Application.java, donc les solutions que j'ai vues en utilisant Spring Configuration ne rentrent pas non plus.

Voici (je l'espère) pertinentes parties de mon projet:

Ceci est mon fichier Application.java. Je n'ai rien fait avec, c'est exactement le même fichier que dans le github d'origine que j'ai cloné.

package project; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.context.web.SpringBootServletInitializer; 

/** 
* The main class of the project. 
* By running the main class of {@link Application} then you start the Spring Boot system 
*/ 
@SpringBootApplication 
public class Application extends SpringBootServletInitializer{ 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder){ 
     return applicationBuilder.sources(Application.class); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class,args); 
    } 

} 

Voici mes applications.properties. Ici, je viens d'ajouter la substance de base de données:

spring.view.prefix=/WEB-INF/jsp/ 
spring.view.suffix=.jsp 
multipart.maxFileSize=-1 
debug=true 

spring.datasource.url=jdbc:postgresql://localhost:5432/finaltest 
spring.datasource.username=myusername 
spring.datasource.password=mypassword 

Voici mon pom.xml (le seul fichier xml dans mon projet). Ici, je viens de dépendances de base de données ajouté:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>HBV501G</groupId> 
    <artifactId>Spring_Web_MVC</artifactId> 
    <version>0.1</version> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.5.RELEASE</version> 
    </parent> 

    <dependencies> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-jasper</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.4-1200-jdbc41</version> 
     </dependency> 

    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

Le reste du projet, je me suis fait, à commencer par mon UploadController. Il prend juste les fichiers, les balises et les types d'une demande de publication, écrit le fichier actuel dans un emplacement dans le système de fichiers sous un nom généré aléatoirement et stocke des informations sur le fichier (type, balises, nom et emplacement dans le système de fichiers). base de données:

package project.controller; 

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.util.List; 
import java.util.Random; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.multipart.MultipartFile; 
import project.service.MediaFile; 
import project.service.MediaFileRepository; 

@Controller 
public class UploadController { 
    private final String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    private Random rnd = new Random(); 
    private int randomLength = 8; 

    @Autowired 
    private MediaFileRepository repository; 

    @RequestMapping(value = "/uploadmedia", method = RequestMethod.GET) 
    public String uploadForm() { 
     return "upload"; 
    } 

    @RequestMapping(value = "/uploadmedia", method = RequestMethod.POST) 
    public String uploadSubmit(@RequestParam(value="files[]") MultipartFile[] files, 
           @RequestParam("tags[]") String[] tags, @RequestParam("types[]") String[] types) 
    { 
     String[] tagsArray; 
     MultipartFile file; 
     String name; 
     String tag; 
     String path; 
     String type; 

     for (int i = 0; i < files.length; i++) { 
      file = files[i]; 
      tagsArray = tags[i].split("\\s+"); 
      type = types[i]; 

      name = randomString(randomLength); 
      List<MediaFile> nameExists = repository.findByName(name); 
      while (nameExists.size() > 0) { 
       name = randomString(randomLength); 
       nameExists = repository.findByName(name); 
      } 

      path = "/Users/.../src/main/resources/static/img/" + name + type; 
      if (!file.isEmpty()) { 
       try { 
        byte[] bytes = file.getBytes(); 
        BufferedOutputStream stream = 
          new BufferedOutputStream(new FileOutputStream(new File(path))); 
        stream.write(bytes); 
        stream.close(); 
        for (int j = 0; j < tagsArray.length; j++) { 
         tag = tagsArray[j].toLowerCase(); 
         repository.save(new MediaFile(name, tag, path, type)); 
        } 
        System.out.println("Success!"); 
       } catch (Exception e) { 
        System.out.println("Failure... " + e.getMessage()); 
       } 
      } else { 
       System.out.println("file is empty"); 
      } 
     } 
     return "upload"; 
    } 

    private String randomString(int len){ 
     StringBuilder sb = new StringBuilder(len); 
     for(int i = 0; i < len; i++) 
      sb.append(AB.charAt(rnd.nextInt(AB.length()))); 
     return sb.toString(); 
    } 
} 

... Ensuite, voici mon MediaController (Les fichiers en cours de téléchargement sont une sorte de médias). Il vérifie juste si une url a un fichier avec un nom correspondant dans la base de données et si c'est le cas, envoie le chemin du fichier à media.jsp.

package project.controller; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import project.service.MediaFile; 
import project.service.MediaFileRepository; 

import java.util.List; 

/** 
* Created by johannesthorkell on 13.10.2015. 
*/ 

@Controller 
@RequestMapping("/media") 
public class MediaController { 

    @Autowired 
    private MediaFileRepository repository; 

    @RequestMapping("/{media}") 
    public String newMedia(@PathVariable String media, Model model) { 
     List<MediaFile> nameExists = repository.findByName(media); 
     if (nameExists.size() > 0) { 
      MediaFile mediaFile = nameExists.get(0); 
      String name = mediaFile.getName(); 
      String type = mediaFile.getType(); 
      model.addAttribute("image", "/img/" + name + type); 
      return "media"; 
     } 
     return "error"; 
    } 
} 

... Et enfin, voici mon fichier media.jsp. Il prend simplement l'emplacement du fichier de mon MediaController et le place comme l'attribut src d'un élément img (les fichiers que j'utilise pour tester ce sont des fichiers image).

<!DOCTYPE html> 

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 

<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>Home</title> 
    </head> 
     <h1>Media Upload</h1> 
     <img src="${image}"> 
     <div id="links"> 
      <a href="/uploadmedia">upload media</a> 
      <a href="/searchmedia">search media</a> 
     </div> 
    </body> 
</html> 
+0

Copie possible de [Comment est-ce que j'utilise Spring Boot pour servir du contenu statique situé dans le dossier Dropbox?] (Http: // stackoverflow.com/questions/21123437/how-do-i-use-spring-boot-à-servir-statique-contenu-situé-dans-dropbox-dossier) – jny

Répondre

5

Vous pouvez créer un haricot @Configuration, comme

@Configuration 
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter { 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     super.addResourceHandlers(registry); 
     registry.addResourceHandler("/**").addResourceLocations("file:///D:/your_image_location/"); 
    } 
} 

assurez-vous de placer la fève dans le même package où votre Application réside, ou quelque part en dessous, afin qu'il soit automatiquement scannés

+0

C'est exactement ce que je cherchais! –