2016-03-21 15 views
0

Gibt es eine Möglichkeit, temporäre Links zum Herunterladen von Dateien mit Spring Web, Sicherheit-oauth Stapel generieren?Spring generierenden Download-Link

Zum Beispiel domain.com/document/ed3dk4kfjw34k43kd4k3cc das funktioniert nur auf aktuelle Sitzung?

Antwort

1

Sie können versuchen, der Sitzung Map<String, String> hinzuzufügen. Danach können Sie generierte eindeutige Strings und Dateinamen in dieser Map speichern. Jedes Mal, wenn Sie die Datei nach einer eindeutigen generierten Zeichenfolge laden müssen, finden Sie den tatsächlichen Dateinamen nach Zeichenfolge und senden ihn an den Client. Einfache Komponente zur Demonstration der Idee:

@Component 
@Scope(value = "session") 
public class SessionFileMap { 

    private Map<String, String> fileMap = new HashMap<>(); 

    public String getUniqueString(String fileName){ 
     for(String uniqueName: fileMap.keySet()){ 
      //check, if file already in map, return it 
      if(fileMap.get(uniqueName).equals(fileName)) return uniqueName; 
     }    
     //otherwise, create new 
     String uniqueName = generateUniqueName(); 
     fileMap.put(uniqueName, fileName); 
     return uniqueName; 
    } 

    public String getFileName(String uniqueString){ 
     if(fileMap.containsKey(uniqueString)){ 
      return fileMap.get(uniqueString); 
     } 
     return null; 
    } 

    private String generateUniqueName() { 
     String uniqueString = //generation of unique string 
     return uniqueString; 
    } 
} 

Natürlich müssen Sie diese Komponente Umfang session machen. Und there is gute Beispiele, wie Sie eindeutige Zeichenfolgen generieren können. Nun Beispiel für die Verwendung dieser Komponente:

@Controller 
@Scope(value = "session") 
public class FileController { 

    @Autowired 
    private SessionFileMap fileMap; 

    @Autowired 
    private ApplicationContext context; 

    @RequestMapping("/file") 
    public String showLink(ModelMap model, HttpSession session){ 
     String uniqueString = fileMap.getUniqueString("/filepath/filename.ext"); 
     model.addAttribute("uniqueString", uniqueString); 
     return "file"; 
    } 

    @RequestMapping("/download/{uniqueString}") 
    public void download(@PathVariable("uniqueString") String uniqueString, 
          HttpServletResponse response){ 
     String fileName = fileMap.getFileName(uniqueString); 
     try{ 
      Resource resource = context.getResource("file:"+fileName); 
      try (InputStream is = resource.getInputStream()) { 

       //prepare all headers for download ... 

       IOUtils.copy(is, response.getOutputStream()); 
       response.flushBuffer(); 
      } 
     }catch(Exception e){ 
      throw new RuntimeException(e); 
     } 
    } 
} 

-Controller muss Umfang session haben sowie Komponente. Wenn Sie notiert haben, habe ich IOUtils.copy() von org.apache.commons verwendet, um Stream zu kopieren, aber Sie können es tun, wie Sie bevorzugen. In der Ansicht sieht Links wie folgt aus:

<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <a href="/download/${uniqueString}">Download</a> 
</body> 
</html> 

Dies ist nur eine Demonstration der Grundidee. Und alle Details sind dir überlassen.

+0

Also Framework bietet keine fertige Lösung? – Fr0stDev1

+1

@ Fr0stDev1 Scheint so zu sein. Zumindest habe ich in Spring Framework keine "gebrauchsfertigen" Lösungen für diese Aufgabe gesehen. –