【问题标题】:How do I create an HTML table of files for download?如何创建 HTML 文件表以供下载?
【发布时间】:2011-01-09 15:32:39
【问题描述】:

我负责为嵌入式设备(复印机)更新现有的 Java 应用程序。

我想做的一件事是创建一个 servlet,它允许下载设备上沙盒目录中的所有文件(其中包括应用程序日志文件、本地缓存等)。目前这些文件都在一个没有子目录的目录中。

基本上我想做的如下:

  • 日志.log
  • Lo​​g.log.1
  • Lo​​g.log.2
  • SomeLocalCache.txt
  • 另一个LocalCache.txt

每一行都是一个可点击的链接,允许下载文件。

但是,我的 HTML 经验基本上为零,而且我对 Java API 的熟悉程度还很初级,所以我正在寻找一些有关正确方法的建议。

我已经阅读了所有提供的示例,这就是我的想法。

我可以在设备上的指定 URL 创建一个 servlet,它将调用我的代码。我们称之为/MyApp

我在下面添加另一个链接,我们称之为/MyApp/Download

当它在浏览器中到达这个地址时,它会显示文件列表。

必须即时创建此列表。我可以创建一个 HTML 模板文件并将其放在 res 文件夹中(这似乎是相关设备的推荐方法),但需要在运行时替换整个文件/链接列表。 Here's 一个例子,我发现使用<ol>+<li> 标记作为列表和<a> 标记作为链接。我可以很容易地即时生成。这是一个合理的方法吗?

例如

<ol>
  <li>
    <a href=".../MyApp/Download/Log.log">Log.log</a>
  </li>
  <!--more <li> elements-->
</ol>

单击单个文件将链接到 /MyApp/Download/File.ext,然后将通过我的 servlet 触发文件下载(我发现 this 代码看起来很有希望用于实际下载)。

在允许用户访问/MyApp 链接或任何子链接之前,设备将要求用户登录,而且我还可以要求登录用户是管理员,然后才允许下载文件,这看起来就足够了这种情况下的安全性(这些文件不需要高度安全性)。

那么我错过了什么重要的事情还是这是一个合理的参与计划?

【问题讨论】:

    标签: java html servlets


    【解决方案1】:

    这是你需要做的总结:

    1. 您可以使用File#listFiles() 获取File[]
    2. 您可以使用 JSTL c:forEach 来遍历数组。
    3. 您可以使用 HTML &lt;ol&gt;&lt;ul&gt;&lt;dl&gt; 元素来显示列表。
    4. 您可以使用 HTML &lt;a&gt; 元素来显示链接。
    5. 您可以使用Servlet 将本地文件的InputStream 写入响应的OutputStream。请记住至少传递Content-TypeContent-LengthContent-Disposition
    6. 您可以利用请求路径信息安全地传递文件标识符。例如。在/files/* 上映射servlet 并让链接指向http://example.com/files/path/to/file.ext,在servlet 中您可以通过request.getPathInfo() 获取/path/to/file.ext

    可以在此处找到基本且可靠的 servlet 示例:FileServlet。如果您想添加恢复和压缩功能,那么您可能会发现改进后的FileServlet 更有用。

    也就是说,大多数应用服务器默认也只支持目录列表。例如,Tomcat 默认支持它。您可以在 Tomcat 的 server.xml 中定义另一个 &lt;Context&gt;,使用 docBaseC:/path/to/all/files/files 的上下文路径(以便 http://example.com/files 可以访问它。

    <Context docBase="/path/to/all/files" path="/files" />
    

    基本上就是这样。不需要自制代码/html/servlet。

    【讨论】:

      【解决方案2】:

      编辑

      通过此链接判断when to use UL or OL in html? 很多人会在下面锤击答案并发表评论,因为他们说将语义信息放入 HTML 很重要。

      我的意思很简单——唯一的区别是浏览器将显示一个带有项目符号的点(正如 OP 似乎想要的那样)和一个带有数字的(就像 OP 不想要的那样。)我建议他将 HTML 更改为他希望它呈现,或者保持原样,并进行一些 CSS 更改。

      是的,两者之间存在语义差异...它们仍将按照此处定义的顺序呈现http://www.w3.org/TR/html401/struct/lists.html HTML 是放置语义信息的地方吗?我认为不是,生成 HTML 的代码是正确的地方。您的凝聚力可能会有所不同。

      为了历史,我不会更改我原来的评论。

      结束编辑

      对我来说似乎很好——但是&lt;ol&gt; 不再被真正使用,我会选择&lt;ul&gt;。别担心,它仍然按照您的预期排序。

      这样做的原因是两者之间的唯一区别是浏览器会自动对有序列表进行编号(以之前的数字呈现)。但是,有了 CSS,所有的渲染控件都可以在 CSS 中(包括编号),每个人都很高兴。

      几乎没有人再使用自动编号了。事实上,通过 CSS,列表可以并且被用于各种疯狂的事情,包括 CSS 菜单系统。

      【讨论】:

      • 不再真正使用:这毫无意义。如果你想要一个有序列表(带有索引号),你使用&lt;ol&gt;,如果你想要一个无序列表(只有项目符号),你使用&lt;ul&gt;
      • 参见我在 BalusC 上面的附加说明,这一切都可以通过 CSS 完成,并且对前端编码器有更多的控制。此外,在他的示例中,他没有数字。
      • 您不应该使用 CSS 创建有序列表。 &lt;ol&gt;&lt;ul&gt; 基本上有两种不同的语义含义。就像&lt;em&gt;&lt;strong&gt;,两者在语义上都是有价值的。当然你可以使用 CSS 来改变有序列表的 look
      • 嗯,在我的情况下,&lt;ul&gt; 实际上在语义上和我希望它呈现的方式上都更准确(使用项目符号而不是数字)。所以这就是我要去的。
      • 接受了因为有用的建议以及似乎没有其他人找到任何回答的理由。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2021-12-21
      相关资源
      最近更新 更多