2016-03-21 10 views
0

spring web、security-oauthスタックを使用してファイルをダウンロードするための一時リンクを生成する方法はありますか?スプリング生成ダウンロードリンク

たとえば、現在のセッションでのみ動作するdomain.com/document/ed3dk4kfjw34k43kd4k3ccですか?

答えて

1

セッションに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> 

これは基本的なアイデアのデモです。すべての詳細はあなた次第です。

+0

したがって、フレームワークはすぐに解決策を提供しませんか? – Fr0stDev1

+1

@ Fr0stDev1そうだね。少なくとも、私はSpring Frameworkでこのタスクのための "使用可能な"ソリューションを見ていませんでした。 –