在Grails控制器中打开或下载URL链接

在Grails控制器中打开或下载URL链接,grails,groovy,Grails,Groovy,我想在Grails控制器方法中呈现或下载链接到PDF的URL。我可以在一个新的或相同的标签中打开它,或者只是下载它。在grails中是如何做到这一点的 到目前为止,我已经: render(url: "http://test.com/my.pdf") 但是,我用这种方法和我尝试过的其他方法(例如用内容呈现响应)都会出错。有什么线索吗?是的,你完全可以轻松做到: 首先从URL获取文件(如果您没有本地文件),例如: class FooService { File getFileFromUR

我想在Grails控制器方法中呈现或下载链接到PDF的URL。我可以在一个新的或相同的标签中打开它,或者只是下载它。在grails中是如何做到这一点的

到目前为止,我已经:

render(url: "http://test.com/my.pdf")

但是,我用这种方法和我尝试过的其他方法(例如用内容呈现响应)都会出错。有什么线索吗?

是的,你完全可以轻松做到:

首先从URL获取文件(如果您没有本地文件),例如:

class FooService {

    File getFileFromURL(String url, String filename) {
        String tempPath = "./temp"     // make sure this directory exists

        File file = new File(tempPath + "/" + filename)
        FileOutputStream fos = new FileOutputStream(file)
        fos.write(new URL(url).getBytes())
        fos.close()
        file.deleteOnExit()

        return file
    }
}
现在在控制器中,执行此操作以允许用户自动下载您的PDF文件:

class FooController {

    def fooService

    def download() {
        String filename = "my.pdf"
        // You can skip this if you already have that file in the same server
        File file = fooService.getFileFromURL("http://test.com/my.pdf", filename)

        response.setContentType("application/octet-stream")
        response.setHeader("Content-disposition", "${params.contentDisposition}; filename=${filename}")
        response.outputStream << file.readBytes()
        return
    }
}
类控制器{
def食品服务
def下载(){
String filename=“my.pdf”
//如果同一服务器中已经有该文件,则可以跳过此操作
File File=fooService.getFileFromURL(“http://test.com/my.pdf“,文件名)
response.setContentType(“应用程序/八位字节流”)
response.setHeader(“Content disposition”,“${params.contentDisposition};filename=${filename}”)
response.outputStream一个选项是

class ExampleController {
    def download() {
        redirect(url: "http://www.pdf995.com/samples/pdf.pdf")
    }
}
转到
localhost:8080/appName/example/download
将根据用户的浏览器首选项下载文件或在同一选项卡中打开文件进行阅读


我使用Grails2.5.0

您希望在控制器中下载URL的目标,并可能将其存储在本地(服务器上)然后提供它?或者你想向用户显示一个PDF的链接?并可能通过Grails发布该PDF?我只需要自动下载到“Downloads”目录就可以了。比如,当你点击页面上的任何链接,它就会自动下载它,我不确定你是否可以这样做。让请求返回JSON会更容易(如
render([url:http://test.com/my.pdf“]作为JSON)
)并在客户端使用Javascript打开链接(
window.open(response.url);
)?@AlexandraMirtcheva谁应该将其下载到“下载”目录?用户或服务器?此处为“下载”dir是,在运行Grails应用程序的同一台服务器上的用户计算机上?@IgorArtamonov下载目录将位于客户端,因此是用户。我最终使用了
render(url:)http://test.com/my.pdf"]作为控制器中的JSON
,然后在javascript中,我设置了
window.location=url
,并立即下载了它。我同意,这是更好的选择。我可以下载我的文件。但是我需要在新选项卡中显示我的PDF文件,我现在应该做什么,从哪里可以获得url?