从我的Grails应用程序访问本地存储的文件?

时间:2012-05-23 22:19:41

标签: hibernate grails groovy

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

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

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

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

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

感谢您提供的任何意见。

1 个答案:

答案 0 :(得分:2)

资源指令是相对于网络应用程序根目录的,因此我认为它不能访问其他任何内容。

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

docs在文件上传方面有很好的部分。您可以按照它并将文件保存到您有权访问的任何目录 - 映射或网络或本地。可能最好在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()
}