有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何最好地配置用户上传支持文件的上传位置

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    简而言之

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

    有一篇关于this site的好文章

    我在这里引用基本步骤

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

    还有一些例子


    我与他们没有任何关系

  2. # 2 楼答案

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

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

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

    假设servlet 3.1需要Tomcat 8的工作示例,如果您在较旧的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
        }
    }
    

    ^{}是一种将上传的部分写入磁盘的方便方法

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