【问题标题】:How do I best configure an upload location for users to upload support files如何最好地为用户配置上传位置以上传支持文件
【发布时间】:2017-06-21 11:50:48
【问题描述】:

问题:我的基于 java 的软件产品可以将支持文件创建为 zip 文件,如果用户有问题,我会要求他们给我发电子邮件或使用 Dropbox 之类的工具上传文件。问题是支持文件通常太大而无法通过电子邮件发送,并且对于某些用户来说使用诸如 dropbox 之类的工具很困难。

我有一个支持 ftp 的服务器(运行 apache tomcat),所以我可以让用户简单地上传文件,但是它需要用户名和密码。在应用程序中嵌入用户名和密码肯定是一个坏主意,也许我可以配置一个不需要用户名/密码的位置,但是我如何保护其他用户的用户数据。

上传支持文件是许多应用程序的标准行为,但我不清楚如何最好地实现。

【问题讨论】:

    标签: java tomcat file-upload upload dropbox


    【解决方案1】:

    您的用户只需要上传一个支持文件,他们不需要(并且您不希望他们)在上传后查看它,更不用说其他用户发送的其他文件了。所以我建议不要使用 FTP。

    您可以改为在 Tomcat 中部署一个简单的应用程序,使用一个简单的 servlet 来接受通过 HTTP POST 上传的文件。 Here is a great answer 解释了如何开发这样的 servlet(忽略不适用于您的“介绍”段落,但请阅读其余部分)。 servlet 只需要回复类似“使用票号 12345 上传支持文件,谢谢”之类的内容。该 servlet 应该受到保护,最低限度是只接受上传以及您将随应用程序分发的令牌。

    在该 servlet 中,您需要将文件保存在适当的位置,here is another detailed answer(由同一作者)来决定。在您的情况下,最简单的方法是将其保存在 Tomcat 不提供服务的位置,因此只有您可以使用 SSH 在您的服务器上收集它们。或者,您可以将文件保存到受保护的位置,以便可以查看和下载文件,但不能查看和下载您的用户(因此您只需要 1 个密码,而不是您的用户)。

    假设需要 Tomcat 8 的 servlet 3.1 的工作示例,如果您在较旧的 Tomcat 版本上需要此功能,请参阅链接的答案以获取详细信息:

    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Part;
    import java.io.IOException;
    import java.nio.file.Paths;
    import java.util.UUID;
    
    @MultipartConfig // So you can call getPart(...) in doPost(...)
    public class SupportFileUpload extends HttpServlet {
    
        private String uploadDirectory;
    
        @Override
        public void init(ServletConfig config) throws ServletException {
            super.init(config);
            // Configure location with <init-param> in web.xml
            uploadDirectory = config.getInitParameter("upload_directory");
            if (uploadDirectory == null) {
                uploadDirectory = System.getProperty("java.io.tmpdir");
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String token = request.getHeader("token");
            if (!isValid(token)) {
                response.setStatus(403);
                response.getWriter().println("Rejected");
                return;
            }
            Part filePart = request.getPart("file");
            String fileName = filePart.getSubmittedFileName();
            UUID uuid = UUID.randomUUID();
            filePart.write(Paths.get(uploadDirectory, "support_" + uuid + "_" + fileName).toString());
            response.getWriter().println("Uploaded: " + uuid);
        }
    
        private boolean isValid(String token) {
            return "plzhalp".equals(token); // Implement tight security here
        }
    }
    

    Part.write(String) 是一种将上传的部分写入磁盘的便捷方法。

    在客户端,您可以使用Commons HttpClient 上传文件。

    【讨论】:

    • 谢谢你,这听起来很明智
    【解决方案2】:

    总之

    您想创建一个密码保护目录,供用户通过 ftp 上传内容。

    this site上有一篇好文章

    我在这里引用基本步骤

    1. 在 conf/tomcat-users.xml 中添加用户、密码和角色
    2. 在 webapps/examples/WEB-INF/web.xml 中指定角色、方法和 url。
    3. 重启 Tomcat 并检查。

    例子也有


    我与他们没有任何关系

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多