【问题标题】:Access a locally stored file from my Grails app?从我的 Grails 应用程序访问本地存储的文件?
【发布时间】:2012-05-23 22:19:41
【问题描述】:

我需要让我的 grails 应用程序访问本地存储的 pdf 文件以供参考。我有一个到本地服务器上某个位置的绝对路径,并且该应用程序将在同一网络上运行。

我不确定是否最好让用户将文件名输入文本字段(受用户错误影响)然后将其存储在数据库中,然后我可以创建一个链接以将其附加到路径如:

<a href="${resource(dir:'/serverName/locationName/pdfs',file:'FILENAME_with_Ext.pdf')}" target="_new">pdfFile</a>

但这似乎不起作用,因为它找不到文件并且我收到 404 错误

我在想的另一件事是让用户上传文件可能更容易,如果有的话,因为可能并不总是有文件。我认为这可能是更好的方法,但我不知道将文件存储在哪里。我会在 Web 应用程序目录中创建一个文件夹并将所有文件存储在那里吗?

感谢您提供的任何意见。

【问题讨论】:

    标签: hibernate grails groovy


    【解决方案1】:

    资源指令是相对于网络应用根目录的,所以我认为它不能访问除此之外的任何东西。

    我不确定您所说的可能并不总是有服务器是什么意思 - 总是有一个服务器运行应用程序。如果您指的是数据库服务器,我想这在技术上是正确的,尽管您至少可以始终使用 H2 或其他内存数据库。

    docs 有一个很好的文件上传部分。您可以按照它并将文件保存到您有权访问的任何目录 - 映射的或网络的或本地的。可能最好在 Web 应用程序之外执行此操作,这样您在重新部署时就不会覆盖。保存文件名和您需要向用户展示的任何描述。

    然后要访问,您可能需要在您的网络服务器(tomcat 等)中设置某种别名。因此,假设您将文档存储在 /var/myWebApp/uploads,然后您使用 Web 服务器设置创建一个别名,以便 /uploads/ 指向 /var/myWebApp/uploads 并将它们作为 http://www.myserver.com/uploads/uploaded.pdf 提供服务

    我不知道您对该站点有什么安全问题,但如果您担心人们会浏览上传目录,并且不允许该目录显示为索引,您可能希望混淆文件名并列出其中包含的文件。

    编辑

    非常基本的例子

    //class
    class MyClass {
        String fileDescription
        byte[] fileDocument
    }
    
    //form
    <g:uploadForm action="save">
        Description <g:textField name="fileDescription" />
        <input type="file" name="fileDocument" />
        <input type="submit" 
    </g:uploadForm>
    
    //controller
    def save = {
        def myClass = new MyClass(params)
        myClass.save()
    }
    

    【讨论】:

    • 我猜“并不总是会成为服务器”指的是 pdf 文件。 A dangling participle!
    • 正确,文件不会一直存在。
    • 明白了——我认为这更指向上传。我认为让最终用户从文件列表中选择或进行自动填充而不是让他们输入文件名然后去查找文件看起来要好得多。消除了一些用户的挫败感,他们看到更少的“我们找不到你想要的”消息。
    • @Kelly - 好的,我无法理解的是如何在另一个表单中上传文档,因为我让他们在选择其他信息的同时选择要上传的文档.一旦他们点击提交按钮,我希望文档与其他信息一起保存。我能够将数据以 blob 形式存入数据库,但我不确定“保存文件名和任何描述”是什么意思 - 我将如何做那部分?
    • 您可以在同一个上传表单中包含任何其他标准表单字段。 标签所做的只是将 enctype="multipart/form-data" 添加到常规表单标签中。因此,如果您需要,您可以添加一个字段供用户输入上传文档的描述或标题;然后将其保存在用于保存上传文档的同一控制器操作中。如果您使用数据绑定来完成这一切,那就太简单了。我会用一个小样本更新我的原始答案。
    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 2014-12-06
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多