问题:我的基于java的软件产品可以创建支持文件作为zip文件,如果用户有问题我要求他们给我发电子邮件或使用dropbox等文件上传文件。问题是支持文件通常太大而无法通过电子邮件发送,并且使用诸如dropbox之类的工具对某些用户来说很难。
我有一个支持ftp的服务器(运行apache tomcat),所以我可以让用户只需上传文件,但它需要用户名和密码。在应用程序中嵌入用户名和密码肯定是个坏主意,也许我可以配置一个不需要用户名/密码的位置,但是如何保护用户数据呢?
上传支持文件是许多应用程序的标准行为,但我不清楚它是如何最好地实现的。
答案 0 :(得分:0)
您想为用户创建密码保护目录,以便通过ftp上传内容。
上有一篇很好的文章我引用了这里的基本步骤
也有例子
我与他们没有任何关系
答案 1 :(得分:0)
您的用户只需要上传支持文件,他们不需要(并且您不希望他们)在上传后查看它,更不用说其他用户发送的其他文件了。所以我建议不要使用FTP。
您可以在Tomcat中部署一个简单的应用程序,使用一个简单的servlet接受使用HTTP POST上传的文件。 Here is a great answer解释了如何开发这样一个servlet(忽略"简介"段落不适用于你,但请阅读其余部分)。 servlet只需回复类似"支持文件上传的票号12345,谢谢"。该servlet应该受到保护,最小的只是接受上传以及您随应用程序分发的令牌。
在该servlet中,您需要将文件保存在适当的位置,here is another detailed answer(由同一作者)来决定。在你的情况下,最简单的方法是将它保存在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上传文件。