Spring 生成下载 link
Spring generating download link
有什么方法可以使用 spring 网络、security-oauth 堆栈生成用于下载文件的临时链接?
例如 domain.com/document/ed3dk4kfjw34k43kd4k3cc
仅适用于当前会话?
您可以尝试将 Map<String, String>
添加到会话中。之后,您可以将生成的唯一字符串和文件名存储到此映射中。每次,当你需要通过唯一生成的字符串加载文件时,你会通过字符串找到真实的文件名并将其发送给客户端。用于演示想法的简单组件:
@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;
}
}
当然,你必须让这个组件作用域session
。 there is 很好的例子,如何生成唯一的字符串。现在使用此组件的示例:
@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);
}
}
}
控制器必须具有 session
的范围以及组件。如果您注意到,我使用 IOUtils.copy()
从 org.apache.commons
复制流,但您可以按照自己的喜好进行操作。在视图中,链接将如下所示:
<html>
<head>
<title></title>
</head>
<body>
<a href="/download/${uniqueString}">Download</a>
</body>
</html>
这只是基本概念的演示。所有细节都由您决定。
有什么方法可以使用 spring 网络、security-oauth 堆栈生成用于下载文件的临时链接?
例如 domain.com/document/ed3dk4kfjw34k43kd4k3cc
仅适用于当前会话?
您可以尝试将 Map<String, String>
添加到会话中。之后,您可以将生成的唯一字符串和文件名存储到此映射中。每次,当你需要通过唯一生成的字符串加载文件时,你会通过字符串找到真实的文件名并将其发送给客户端。用于演示想法的简单组件:
@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;
}
}
当然,你必须让这个组件作用域session
。 there is 很好的例子,如何生成唯一的字符串。现在使用此组件的示例:
@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);
}
}
}
控制器必须具有 session
的范围以及组件。如果您注意到,我使用 IOUtils.copy()
从 org.apache.commons
复制流,但您可以按照自己的喜好进行操作。在视图中,链接将如下所示:
<html>
<head>
<title></title>
</head>
<body>
<a href="/download/${uniqueString}">Download</a>
</body>
</html>
这只是基本概念的演示。所有细节都由您决定。