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.
Also Framework bietet keine fertige Lösung? – Fr0stDev1
@ Fr0stDev1 Scheint so zu sein. Zumindest habe ich in Spring Framework keine "gebrauchsfertigen" Lösungen für diese Aufgabe gesehen. –