通过 getRealPath() 将上传的文件写入磁盘时出现 java.io.FileNotFoundException

2024-01-07

Glassfish 似乎在我也想保存图像文件的路径中添加了额外的内容,是否有某种方法可以仅使用我的 servlet 获得的绝对路径

String appPath = request.getServletContext().getRealPath("");?

我花了几天时间尝试不同的方法来上传图像文件并让 servlet 将其保存到磁盘。

我用了这个例子:http://www.codejava.net/java-ee/servlet/how-to-write-upload-file-servlet-with-servlet-30-api http://www.codejava.net/java-ee/servlet/how-to-write-upload-file-servlet-with-servlet-30-api

使用调试我可以看到文件名和路径信息已正确收集,但代码在“part.write(savePath + File.separator + fileName);”处失败

glassfish的异常报告是:

exception

java.io.FileNotFoundException: C:\Program Files\glassfish-3.1.2.2\glassfish\domains\domain1\generated\jsp\com.onemore_onemore-web_war_1.0-SNAPSHOT\D:\Dropbox\Git\Brian_JEE\onemore\onemore\onemore-web\target\onemore-web-1.0-SNAPSHOT\image\screengrab_all_products.jpg (The filename, directory name, or volume label syntax is incorrect)

我可以看到正确的路径作为此异常的一部分D:\Dropbox\Git\Brian_JEE\onemore\onemore\onemore-web\target\onemore-web-1.0-SNAPSHOT\image\screengrab_all_products.jpg

JSP

<form action="${pageContext.request.contextPath}/imageupload" method="post" enctype="multipart/form-data" name="productForm" id="productForm">
<input type="file" name="file" id="file">
<input type="submit" name="Submit" value="Submit"></td>
</form>

Servlet

@WebServlet(name = "UploadImageServlet", urlPatterns = {"/imageupload"})
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB 
maxFileSize = 1024 * 1024 * 10, // 10MB
maxRequestSize = 1024 * 1024 * 50)   // 50MB
public class UploadImageServlet extends HttpServlet {

    /**
     * Name of the directory where uploaded files will be saved, relative to the
     * web application directory.
     */
    private static final String SAVE_DIR = "image";

    /**
     * handles file upload
     */
    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
      // gets absolute path of the web application
        String appPath = request.getServletContext().getRealPath("");
        // constructs path of the directory to save uploaded file
        String savePath = appPath + File.separator + SAVE_DIR;

        // creates the save directory if it does not exists
        File fileSaveDir = new File(savePath);
        if (!fileSaveDir.exists()) {
            fileSaveDir.mkdir();
        }

        for (Part part : request.getParts()) {
            String fileName = extractFileName(part);
            part.write(savePath + File.separator + fileName);
        }

        request.setAttribute("message", "Upload has been done successfully!");
        getServletContext().getRequestDispatcher("/WEB-INF/jsp/newproduct.jsp").forward(
                request, response);
    }

    /**
     * Extracts file name from HTTP header content-disposition
     */
    private String extractFileName(Part part) {
        String contentDisp = part.getHeader("content-disposition");
        String[] items = contentDisp.split(";");
        for (String s : items) {
            if (s.trim().startsWith("filename")) {
                return s.substring(s.indexOf("=") + 2, s.length() - 1);
            }
        }
        return "";
    }
}

切勿使用 getRealPath()

您不应将上传的文件保存在部署文件夹中。我之前已经解释过很多次了。这些解释之一可以在这个答案中找到:上传的图片仅在刷新页面后可用 https://stackoverflow.com/questions/8885201/uploaded-image-only-available-after-refreshing-the-page/8889096#8889096.

在某些博客/文章中找到的任何使用过的 JSP/Servlet 代码片段getRealPath()方法应与一大袋盐一起服用。它的质量和作者的知识应该受到强烈质疑。也就是说,该方法在现实世界中没有合理的用例 https://stackoverflow.com/questions/12160639/what-does-mean-in-the-function-servletcontext-getrealpath/12160863#12160863.

将上传的文件保存在部署文件夹之外的固定路径中。也可以看看如何使用 Commons FileUpload 设置存储文件上传的文件夹 https://stackoverflow.com/questions/13528081/how-do-i-set-the-folder-for-storing-file-uploads-using-commons-fileupload/13532453#13532453.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 getRealPath() 将上传的文件写入磁盘时出现 java.io.FileNotFoundException 的相关文章

  • 多文件上传字段的重力形式预览缩略图

    我们使用重力形式将多个图像附加到图库自定义字段并创建新帖子 我们不知道如何在 HTML5 导入字段下显示图像缩略图 而不仅仅是在提交表单之前显示文件名 之前的答案仅涵盖单个文件上传 图片上传重力形式预览 https stackoverflo
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp
  • 为什么 RackMultipart* 文件保留在我的 Rails /tmp 目录中?

    我正在使用 Paperclip 2 3 来处理在 Ubuntu 上运行的 Rails 3 0 3 应用程序上的图像上传 Paperclip 正在按广告处理上传 但在应用程序的 tmp 文件夹中创建的 RackMultipart 文件仍然存在
  • HTML:选择多个文件但未显示文件名?

    我使用 多个 标签让用户选择多个文件进行上传
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • ServletContext getContextPath()

    我检查了我的 Netbeans 项目中包含的 Tomcat 库的 javadoc 当我部署代码时工作正常 但是当我对我的 Web 项目进行全新构建时 我在 getContextPath 上收到 找不到符号 ServletContext接口的
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 上传图像 onclick 多个蒙版图像

    一旦用户单击蒙版图像 我们就允许用户上传自定义图像 如果有单个蒙版图像 则效果很好 https codepen io kidsdial pen jJBVON https codepen io kidsdial pen jJBVON 要求 但
  • HttpSession 内的同步是否可行?

    UPDATE 问题后立即解决 问题 通常 同步是在 JVM 内序列化并行请求 例如 private static final Object LOCK new Object public void doSomething synchroniz
  • 在返回响应之前获取 servlet 请求的状态

    晚上好 我正在编写一个 Java Servlet Struts 2 Tomcat JSP 等 它能够进行一些相当复杂的模拟 这些可能最多需要 2 分钟才能完成 并将返回结果图表 计算模拟完成的百分比很简单 因为该过程是通过重复相同的计算数千
  • 避免刷新时上传图片

    我正在使用最简单的图像上传形式 我非常希望保持这种方式 只需要一些 php 代码看起来像这样
  • 如何重定向到WEB-INF文件夹中的JSP

    我有一个带有 NAV 的 jsp 其中还包含 UL 和以下元素 如下面的代码所示
  • jsp/servlet 从数组填充下拉框

    大家好 我正在尝试创建一个表单 允许您为某个主题创建一个实验室 它有一个下拉框 您可以在其中选择与该用户相关的主题 但是 当我去加载页面时 我收到此错误g apache jasper JasperException java lang Nu
  • 在Java Servlet中获取通过jquery ajax发送的参数[重复]

    这个问题在这里已经有答案了 我在网上搜索这个主题 但找不到有效的示例 我会很高兴有人能给我帮助 这就是我测试的 ajax url GetJson type POST dataType json contentType application
  • 更新/编辑数据库中输入的数据 - servlet

    我准备了一个用于插入 查看和删除数据的表单 现在我想添加选项来编辑该数据 但要么我遵循错误的方法 要么我不知道如何做到这一点 那么任何人都可以帮助我继续编辑输入的数据吗 我应该参考旧的 html 页面进行编辑还是新页面或 我知道我没有遵循
  • ebean 映射到 BYTEA 的数据类型是什么?

    我有一个游戏 2 0 2 需要在数据库中存储一些文件的应用程序 我们使用 Ebean 作为 ORM 我相信我的数据库中需要一个 BYTEA 列来存储该文件 但我不确定在我的模型中使用什么数据类型 我应该使用某种Blob 或者只是一个byte
  • 载波无法删除图像

    我现在使用 Carrierwave 上传图像 一切都很好 除了一个 当我添加用于删除上传图像的复选框时 我收到错误 无法批量分配受保护的属性 remove image Form Model class Manufacturer lt Act
  • 移动 Safari 中的文件上传和 EXIF

    正如这些问题中所指出的 在某些情况下 iOS 上上传的照片的地理位置和其他 EXIF 元数据会被删除 在 safari 中 https apple stackexchange com questions 326789 gps exif fr

随机推荐