【问题标题】:Appending Extra Path Information to @MultipartConfig(location = "/")将额外路径信息附加到 @MultipartConfig(location = "/")
【发布时间】:2017-10-26 22:17:05
【问题描述】:

我正在开发一个简单的文件上传器。简单的文件上传器添加应该上传各种文件(图像/、视频/、音频/、文本/和 application/***) 分别到图像、视频、音频、文本和应用程序目录。我在将路径(例如 video/)附加到 @MultipathConfig(location = "/files/uploads") 注释中指定的当前目录时遇到问题。我希望上传视频的路径为 /files/uploads/video/aws_signs_javas_creator.mp4 我正在使用 Netbeans 8.02、Ubuntu 上的 GlassFish Server 4.0 进行开发。

index.jsp

<form method="POST" action="upload" enctype="multipart/form-data">
    <div>
        <input type="file" id="file" name="file" multiple/>
    </div>
    <div>
        <button type="submit" name="upload">Upload</button>
    </div>
</form>

文件上传器.java

@WebServlet(name = "FileUploader", urlPatterns = {"/upload"})
@MultipartConfig(location = "/files/upload")
public class FileUploadController extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList());
        InputStream fileContent = null;
        String fileName = null;
        String fileType = null;
        for (Part filePart : fileParts) {
            if (filePart.getSize() != 0) {
                fileName = Decorator.getFileName(filePart);
                fileType = filePart.getContentType();

                fileContent = filePart.getInputStream();
                filePart.write(location + fileName);

                if(fileType.contains("image/")) {
                    filePart.write("/images/" + fileName);
                } else if(fileType.contains("application/")) {
                    filePart.write("/applications/" + fileName);
                } else if(fileType.contains("video/")) {
                    filePart.write("/videos/" + fileName);
                } else if(fileType.contains("text/")) {
                    filePart.write("/texts/" + fileName);
                } else if(fileType.contains("audio/")) {
                    filePart.write("/audios/" + fileName);
                }
            }
        }
    }
    private String getFileName(final Part part) {
        final String partHeader = part.getHeader("content-disposition");
        LOGGER.log(Level.INFO, "Part Header = {0}", partHeader);
        for (String content : part.getHeader("content-disposition").split(";")){
            if (content.trim().startsWith("filename")) {
                return content.substring(
                        content.indexOf('=') + 1).trim().replace("\"", "");
            }
        }
        return null;
    }
}

【问题讨论】:

    标签: java servlets jakarta-ee file-upload java-ee-7


    【解决方案1】:

    两种可能的错误原因:

    您传入一个以/ 开头的文件名。也许 Glassfish 然后不会相对于上传目录写入它,而是相对于绝对位置。因此尝试

    filePart.write("images/" + fileName);
    

    等等

    如果子目录尚不存在,则该部分的写入也可能失败。 (这发生在 Tomcat 中)。

    在这两种情况下,服务器日志文件都希望包含有关问题所在的提示。

    【讨论】:

    • 这里是捕获的异常:java.io.FileNotFoundException: /home/nkengbeza/glassfish-4.1.1/glassfish/domains/domain1/generated/jsp/FilesUploader/files/uploads/images/jquery- logo.png(没有这样的文件或目录)。我希望我的上传路径是:/home/nkengbeza/glassfish-4.1.1/glassfish/domains/domain1/iles/uploads/images/jquery-logo.png
    • @byteHunt3r 在我看来,Glassfish 忽略了您在 @MultipathConfig 注释中指定的位置和/或错误实现了关于写入位置的 Servlet 规范。作为一种解决方法,您可以只使用 Part 的 InputStream 并自己将其写入某个位置,而不是依赖麻烦的 Part.write(String)
    猜你喜欢
    • 2017-01-09
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多