【问题标题】:File between backend a front end (full example)后端和前端之间的文件(完整示例)
【发布时间】:2018-08-20 06:16:37
【问题描述】:

我正在向前端传递一个文件 url。问题是 url 仅对服务器可用(settings.dockerIP()),因为用户没有与 docker 的连接。

所以我需要一种方法将我的 url 转换为文件,然后在后端将其发送给用户..

我当前的代码是这样的(它可以工作,但用户需要一个到 docker 主机的隧道)

控制器

 @RequestMapping("/report")
public ModelAndView report(HttpServletRequest request) {
    String environmentName = request.getParameter("name");
    ModelAndView model = new ModelAndView("report");    
    model.addObject("file", Report.getFileFromContainer(environmentName));

    return model;
}

 public static String getFileFromContainer(String environmentName) {
    Container container = getContainerID(environmentName);
    String url = "";
    if(container != null) {
        Settings settings = Settings.getSettings();
        url = "http://" + settings.getDockerIP() + ":" + settings.getDockerPort() + "/containers/" + container.getId() + "/archive?path=/path/file";
    }
    return url;
}

前端

 <a href="${file}"></a>

【问题讨论】:

  • 创建一个端点,在单击链接时将文件作为 outputStream 附件返回

标签: java html spring spring-mvc docker


【解决方案1】:

您可以创建一个方法,将文件作为流返回,然后将最后一个的 url 分配给链接按钮,

@RequestMapping(value="getFile", method=RequestMethod.GET)
public void getFile(HttpServletResponse response,HttpServletRequest request) {
     String environmentName = request.getParameter("name");
    //here the code to get your file as stream 
    //whether getting the file by Ressource or buffred ,
    //here for example I named a getfileStream() method wihch return your file  InputStream
    InputStream myStream  = getFileStream(environmentName);


    // Set the content type and attachment header add filename and it's extention.
    response.addHeader("Content-disposition", "attachment;filename=myfile.myExtention");
    response.setContentType("txt/plain");

    // copy your file stream to Response 
    IOUtils.copy(myStream, response.getOutputStream());
    response.flushBuffer();
}

为了获得名称parameter,您只需将其传递给/report 控制器中的modelview,然后将其分配给您的链接。

如下:

@RequestMapping("/report")
public ModelAndView report(HttpServletRequest request) {
    String environmentName = request.getParameter("name");
    ModelAndView model = new ModelAndView("report");    
    model.addObject("name", environmentName);

    return model;
}

那么你的链接会是这样的:

<a href="<c:url value="/getFile" />?name=${name}">Get file</a>

getFileStream 可能是这样的:

public InputStream getFileStream(String environmentName) {
    Container container = getContainerID(environmentName);
    String url = "";
    if(container != null) {
        Settings settings = Settings.getSettings();
        url = "http://" + settings.getDockerIP() + ":" + settings.getDockerPort() + "/containers/" + container.getId() + "/archive?path=/path/file";
    }
    InputStream is = new URL(url).openStream();

    return is; 
}

您必须将以下appace common io添加到您的项目中才能使用IOUtils

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

【讨论】:

  • 如何先从url下载?
  • 环境名称是从哪里发送的?从哪里获取或获取此信息
  • 网址。我得到这个 String environmentName = request.getParameter("name");
猜你喜欢
  • 2014-02-09
  • 2017-12-23
  • 2015-06-19
  • 1970-01-01
  • 2022-01-20
  • 2016-06-14
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
相关资源
最近更新 更多