如何最好地为用户配置上传位置以上传支持文件
How do I best configure an upload location for users to upload support files
问题:我的基于 java 的软件产品可以将支持文件创建为 zip 文件,如果用户遇到问题,我会要求他们给我发电子邮件或使用 dropbox 之类的工具上传文件。问题是支持文件通常太大而无法通过电子邮件发送,并且对于某些用户来说使用诸如 dropbox 之类的工具很困难。
我有一个服务器 (运行 apache tomcat) 支持 ftp 所以我可以让用户简单地上传文件,但是它需要用户名和密码。在应用程序中嵌入用户名和密码肯定不是一个好主意,也许我可以配置一个不需要 username/password 的位置,但是我如何保护用户数据免受其他用户的影响。
上传支持文件是许多应用程序的标准行为,但我不清楚如何最好地实现它。
简而言之
您想为用户通过 ftp 上传内容创建一个密码保护目录。
上有一篇好文章
我在这里引用基本步骤
- 在conf/tomcat-users中添加用户、密码和角色。xml
- 在 webapps/examples/WEB-INF/web.xml 中指定角色、方法和 url。
- 重新启动 Tomcat 并检查。
例子也有
我与他们没有任何关系
您的用户只需要上传一个支持文件,他们不需要(您也不希望他们)在上传后查看它,更不用说其他用户发送的其他文件了。所以我建议反对 FTP.
您可以改为在您的 Tomcat 中部署一个简单的应用程序,其中包含一个接受通过 HTTP POST 上传的文件的简单 servlet。 Here is a great answer 解释了如何开发这样一个 servlet(忽略不适用于您的 "Introduction" 段落,但继续阅读其余内容)。 servlet 只需要回复 "Support file uploaded with ticket number 12345, thank you" 之类的内容。该 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 上传文件。
问题:我的基于 java 的软件产品可以将支持文件创建为 zip 文件,如果用户遇到问题,我会要求他们给我发电子邮件或使用 dropbox 之类的工具上传文件。问题是支持文件通常太大而无法通过电子邮件发送,并且对于某些用户来说使用诸如 dropbox 之类的工具很困难。
我有一个服务器 (运行 apache tomcat) 支持 ftp 所以我可以让用户简单地上传文件,但是它需要用户名和密码。在应用程序中嵌入用户名和密码肯定不是一个好主意,也许我可以配置一个不需要 username/password 的位置,但是我如何保护用户数据免受其他用户的影响。
上传支持文件是许多应用程序的标准行为,但我不清楚如何最好地实现它。
简而言之
您想为用户通过 ftp 上传内容创建一个密码保护目录。
上有一篇好文章我在这里引用基本步骤
- 在conf/tomcat-users中添加用户、密码和角色。xml
- 在 webapps/examples/WEB-INF/web.xml 中指定角色、方法和 url。
- 重新启动 Tomcat 并检查。
例子也有
我与他们没有任何关系
您的用户只需要上传一个支持文件,他们不需要(您也不希望他们)在上传后查看它,更不用说其他用户发送的其他文件了。所以我建议反对 FTP.
您可以改为在您的 Tomcat 中部署一个简单的应用程序,其中包含一个接受通过 HTTP POST 上传的文件的简单 servlet。 Here is a great answer 解释了如何开发这样一个 servlet(忽略不适用于您的 "Introduction" 段落,但继续阅读其余内容)。 servlet 只需要回复 "Support file uploaded with ticket number 12345, thank you" 之类的内容。该 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 上传文件。