我正在写一个包含文件列表的页面。每个文件都应该是可预览和可下载的。因此,每个文件都需要两个锚链接。一个用于下载,一个用于预览。下载链接没有问题,因为中介类型总是";应用程序/八位字节流";但是预览链接必须传递扩展名为url的文件名,这样浏览器才能为文件名扩展名提供的中介类型创建特定的请求。除了文件名之外,我还想传递一个查询参数,即文件的id,因为可能有多个文件具有相同的名称。
所以我的控制器预览方法看起来像这样:
@GetMapping(value = "/show/{filename}", produces = {MediaType.IMAGE_PNG_VALUE,MediaType.IMAGE_JPEG_VALUE, MediaType.APPLICATION_PDF_VALUE, MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_PLAIN_VALUE})
public @ResponseBody byte[] show(@RequestParam("fileid") Long fileId, Model model)
{
...
}
thymelaf模板锚看起来是这样的:
<a th:href="@{/files/show/${file.filename}(fileid=${file.id})}" style="height:24px;" title="Preview">
如图所示,文件名应该是一个路由参数,id是一个查询参数。Thymelaf创建了以下网址:
/files/show/${file.filename}?fileid=13
它成功地插入了fileid并创建了查询格式,但未能替换文件名。我做错什么了吗?这种百里香链接的正确格式是什么?
标准url语法支持同一表达式中的路径参数和普通参数。通常,在构建链接时,我会避免字符串串联。
以下是我将如何格式化这个:
th:href="@{/files/show/{filename}(filename=${file.filename}, fileid=${file.id})}"
好的。。。经过更多的研究,我可以自己解决。thymelaf URL的正确形式是以下两种形式之一:
th:href="@{'/files/show/' + ${file.filename}(fileid=${file.id})}"
th:href="@{|/files/show/${file.filename}(fileid=${file.id})|}"
两者都会起作用。