问题 :我的基于Java的软件产品具有将支持文件创建为zip文件的功能,如果用户遇到问题,我会要求他们给我发送电子邮件或使用Dropbox之类的方式上传文件。问题在于,支持文件通常太大而无法通过电子邮件发送,并且对于某些用户而言,使用诸如Dropbox之类的工具非常困难。
我有一台具有ftp支持的服务器(运行apache tomcat),因此我可以给用户简单地上传文件,但是需要用户名和密码。在应用程序中嵌入用户名和密码肯定不是一个好主意,也许我可以配置一个不需要用户名/密码的位置,但是该如何保护其他用户的用户数据。
上载支持文件是许多应用程序的标准行为,但我不清楚如何最好地实现。
您的用户只需要上传支持文件,他们就不需要(并且您不希望他们)在上传后查看它,甚至更少的是其他用户发送的其他文件。因此,我建议不要使用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) 是将上传的零件写入磁盘的一种便捷方法。
Part.write(String)
在客户端,您可以使用Commons HttpClient上传文件。