后端和前端之间的文件(完整示例)
Posted
技术标签:
【中文标题】后端和前端之间的文件(完整示例)【英文标题】: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 附件返回 【参考方案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");以上是关于后端和前端之间的文件(完整示例)的主要内容,如果未能解决你的问题,请参考以下文章