没有依赖关系的简单 Java 文件上传器
已发表: 2023-01-06当代 Web 应用程序和网站的基本要求之一是能够上传文件,例如文档、照片和视频。 例如,用户可以在 Instagram 等社交网络平台上发布视频和图片。
实施和管理文件上传程序以前是一项艰巨的任务。 值得庆幸的是,由于在线技术的进步,文件上传变得更加简单。 例如, Java 文件上传器使文件上传快速方便。
但是,通过文件上传,网络犯罪分子可能会将恶意软件或其他有害内容引入您的计算机并损坏服务器。 因此,开发人员必须绝对确保在其网站或 Web 应用程序上上传的文件是安全的。 要建立安全的文件上传,我们建议您使用可靠的 Java 文件上传 SDK。
我们将在本文中介绍如何使用 Java 构建文件上传器。
如何使用Java实现文件上传器?
文件上传器只不过是一个“提交”,用户可以单击它来将文件上传到 Web 应用程序或网站。 然而,文件上传器对开发人员的意义要大得多。
我们可以创建一个简单的文件上传器,其中我们只使用一个 HTML 表单和一个 servlet。 在我们的示例中,HTML 表单将有两个输入字段。 第一个输入字段允许用户上传他的文件,第二个输入字段允许开发人员告诉我们应该将文件存储在哪里。
我们正在使用 POST 方法将包括文件在内的表单数据发送到服务器。 另外,当我们上传文件时,我们使用 encrypt=”multipart/form-data” 因为文件包含很多不可打印的字符。
servlet 管理 POST 请求并在处理传入的文件数据后从流中提取文件。 目的地指定系统中必须保存文件的位置。 当我们按下上传按钮时,数据被传输到 servlet,然后将文件存储在指定位置。
使用输入字段创建 HTML 文件
在我们开始之前,先创建一个index.html文件以供后续操作。
index.html应具有以下代码:
<!DOCTYPE html> <html lang=”en”> <头> <title>Java 文件上传器</title> <meta http-equiv=”Content-Type” content=”text/html; 字符集=UTF-8″> </头> <正文> <form method=”POST” action=”upload” enctype=”multipart/form-data” > 文件: <input type=”file” name=”java-file” id=”java-file” /> <br/> 目的地: <input type=”text” value=”/java-folder” name=”destination”/> </br> <input type=”submit” value=”Submit” name=”submit” id=”submit” /> </表格> </body> </html> |
您的页面应该如下所示:
处理文件的服务器端处理
要写出 servlet 代码,我们将创建一个名为 FileUploadServlet.java 的文件。 Serlets 使用注释来定义组件和元数据。 所以@WebServlet 注解用于在 Java 中定义一个 servlet 组件。
Servlet 注释应该说明应该为哪个 URL 执行哪个 HttpServlet。 为此,我们在 @WebServlet 注释中定义了 name 和 ulrPattern 参数。 请注意,当我们提交表单时,我们将重定向到执行 FileUploadServlet 类的 /upload url。
@MultipartConfig 注释通知 servlet 它将接收 MIME 类型的 multipart/form-data。
现在让我们编写完整的代码。
@WebServlet(name = “FileUploadServlet” , urlPatterns = { “/upload” }) @MultipartConfig 公共类FileUploadServlet扩展HttpServlet { 私有最终静态记录器 LOGGER = Logger.getLogger(FileUploadServlet.class.getCanonicalName()); protected void processRequest(HttpServletRequest 请求, HttpServletResponse 响应) 抛出 ServletException,IOException { response.setContentType( “text/html;charset=UTF-8” ); final String dest= request.getParameter( “目的地” ); 最终部分 part = request.getPart( “file” ); final String nameOfFile = getFileName(部分); OutputStream out = null ; InputStream cont = null ; 最终 PrintWriter printWriter = response.getWriter(); 尝试{ out = new FileOutputStream( new File(dest + File.separator + 文件名)); cont = part.getInputStream(); int 阅读器 = 0 ; 最终字节[]字节=新字节[ 1024 ]; while ((reader = cont.read(bytes)) != -1 ) { out.write(bytes, 0 , reader); } printWriter.println( “文件” + nameOfFile + ” 创建于” + dest); LOGGER.log(Level.INFO, “文件{0}上传到{1}” , 新对象[]{nameOfFile, dest}); }赶上(FileNotFoundException fne){ printWriter.println( “你没有提到文件名或者是” + “试图上传一个文件到一个不存在的” + “位置。” ); printWriter.println( “<br/> 错误:” + fne.getMessage()); LOGGER.log(Level.SEVERE, “上传文件时出错。错误:{0}” , 新对象[]{fne.getMessage()}); }最后{ 如果(出!=空){ 关闭(); } 如果(续!=空){ 继续关闭(); } 如果(printWriter!= null ){ printWriter.close(); } } } private String getFileName(最后一部分){ final String partHeader = part.getHeader( “content-disposition” ); LOGGER.log(Level.INFO, “Part Header = {0}” , partHeader); for (String content : part.getHeader( “content-disposition” ).split( “;” )) { 如果(content.trim().startsWith( “文件名” )) { 返回内容。子串( content.indexOf( '=' ) + 1 ).trim().replace( “\”” , “” ); } } 返回空值; } } |
processRequest方法在从请求中检索到目标和文件部分后调用getFileName方法从文件部分获取文件名。 之后,该方法创建一个FileOutputStream并将文件传输到所需位置。 该方法的错误处理部分检测并解决了文件未找到错误的一些最常见原因。
部署代码
现在我们必须构建并运行我们的程序。 为此,您可以使用任何您喜欢的 IDE,例如 NetBeans、Eclipse、Intellij Idea 等。完成后,部分转到
https://cdn.pixabay.com/photo/2016/11/30/20/58/programming-1873854__340.png
如果您使用的是 NetBeans,请打开 Netbeans IDE 并导航到工作目录。 如果遇到问题,请参阅 Java 的官方文档。 在“项目”选项卡中右键单击您的文件夹,然后选择“部署”。 接下来,我们可以访问浏览器并输入以下 URL:
http://localhost:8080/{文件夹名}/
输入 URL 并按回车键后,上面创建的 HTML 页面将打开。 要将文件上传到所需位置,我们可以搜索系统并选择文件。 我们键入要在目标区域中存储文件的文件夹的路径。 该目录必须是可写的并且已经存在于系统中。 当我们单击目标字段为空的上传按钮时,会引发异常。
当我们单击上传按钮时,servlet 会收到一个 POST 请求,并将所选文件复制到指定文件夹。
我们可以访问指定的文件夹,点击上传按钮后查看加载的文件(例如TextFile.txt)是否存在。
到目前为止,我们使用 HTML 和 Java 构建了一个简单的 Java 文件上传器。 然而,随着“简单”成为具有许多功能的复杂上传器,可能很难从那些不重要的功能中找出重要的功能。 更不用说,当我们考虑从头开始构建上传器时,还有几个安全问题。 因此,下一节将带您了解如何使用安全的 Filestack SDK 上传文件。
如何使用 Filestack SDK 轻松上传文件
要继续,您将需要一个Filestack API 密钥。
首先,使用以下命令安装 Filestack SDK:
实施'com.filestack:filestack-java:0.9.0' |
要使用 Filestack 实现上传功能,请在您的 Java 文件中使用以下代码:
// 创建客户端 配置配置=新配置( “API_KEY” ); Client client = new Client(配置); // 设置选项和上传相关的元数据 StorageOptions 选项 = new StorageOptions.Builder() .mimeType( “文本/纯文本” ) .filename( “文件.txt” ) 。建造(); // 执行同步上传 FileLink files = client.upload( “/filepath” , false ); // 执行异步上传 Flowable<Progress<FileLink>> upload = client.uploadAsync( “filepath” , false ); upload.doOnNext( new Consumer<Progress<FileLink>>() { @覆盖 public void accept(Progress<FileLink> progress) throws Exception { System.out.printf( "%f%% 你的文件已上传\n" , progress.getPercent()); 如果(progress.getData() != null ) { FileLink 文件 = progress.getData(); } } }); |
为确保其正常工作,可以运行以下测试:
./文件测试 |
如果您要部署您的应用程序,Bintray 是部署的目标。 要进行部署,您需要一个已在 Filestack 组织注册的用户帐户。 还要遵守基本的 Filestack 发布指南。 需要环境变量“BINTRAY USER”和“BINTRAY API KEY”。 跑步:
导出BINTRAY_USER = ” 导出BINTRAY_API_KEY= ” ./文件 bintrayUpload |
结论
如果您发现难以维护和创建自己的 Java 文件上传系统,您也可以选择第三方工具。 出于数据安全和隐私方面的考虑,人们可能会避免使用第三方系统,例如在上传保存医疗记录的文件时。
此外,他们担心他们几乎无法控制谁有权访问文件存储基础设施。 但是,您可以通过使用可靠的文件上传解决方案来保证表格和文档数据的安全。
常见问题 (FAQ)
可以使用 API 移动文件吗?
是的。 使用 API 移动文件可以使用市场上可用的基于 API 的工具来完成。 这可以与在各种平台上运行的程序结合使用,例如在线程序。
我可以向 REST API 提交大文件吗?
上传大文件可能很困难,尤其是当存在带宽和网络连接不佳等其他因素时。 它可能会导致多次上传失败。
Java如何读取上传的文件?
使用输入流,Java 程序读取字节或字符的集合。 文件读取是一个顺序操作,从构造文件对象开始,将其传递给输入文件,从流中读取数据,进行处理,然后关闭流和文件对象。
什么是文件上传工具?
它是一个 API 或插件,可以连接到您的 Web 应用程序并允许用户上传照片、视频和文本文件,以及允许一些基本的修改、滤镜效果等。