一尘不染

我如何最好地配置上传位置以供用户上传支持文件

tomcat

问题
:我的基于Java的软件产品具有将支持文件创建为zip文件的功能,如果用户遇到问题,我会要求他们给我发送电子邮件或使用Dropbox之类的方式上传文件。问题在于,支持文件通常太大而无法通过电子邮件发送,并且对于某些用户而言,使用诸如Dropbox之类的工具非常困难。

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

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


阅读 210

收藏
2020-06-16

共1个答案

一尘不染

您的用户只需要上传支持文件,他们就不需要(并且您不希望他们)在上传后查看它,甚至更少的是其他用户发送的其他文件。因此,我建议不要使用FTP。

您可以改为在Tomcat中部署一个简单的应用程序,并使用一个简单的Servlet接受通过HTTP
POST上传的文件。这是一个很好的答案,它解释了如何开发这样的servlet(忽略对您不适用的“简介”段落,其余内容请继续阅读)。Servlet仅需要回复“支持文件上传,票证编号为12345,谢谢”。该servlet应该受到保护,最低限度是只接受与您将随应用程序分发的令牌一起使用的上载。

在该Servlet中,您需要将文件保存在适当的位置。在您的情况下,最简单的方法是将其保存在Tomcat不提供服务的位置,因此只有您可以使用SSH在服务器上收集它们。另外,您可以将文件保存到一个受保护的位置,这样
可以看到和下载文件,而不是你的用户(所以你只需要1个密码,你,而不是你的用户)。

假设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
    }
}

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

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

2020-06-16