2

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

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

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

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

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

感谢您给我的任何意见。

4

1 回答 1

2

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

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

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

然后要访问,您可能需要在您的 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()
}
于 2012-05-24T01:13:55.480 回答