【问题标题】:Java EE + Wildfly 9: Use directory outside the deployed app for uploadJava EE + Wildfly 9:使用已部署应用程序外部的目录进行上传
【发布时间】:2015-11-10 09:09:16
【问题描述】:

我正在开发网络应用程序,需要为用户上传文件。上传文件夹在 web 应用程序 之外 - 在 openstack 数据文件夹中(在standalone.xml 中设置) - 示例:

    <host name="default-host" alias="localhost">
                    <location name="/" handler="welcome-content"/>
                    <location name="/folder" handler="folder"/>
                    <filter-ref name="server-header"/>
                    <filter-ref name="x-powered-by-header"/>
                </host>
...

            <handlers>
                <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
                <file name="folder" path="/absolute/path/on/server" directory-listing="true"/>
            </handlers>

如果我需要访问这些文件,没有问题(我只需键入 mydomain.com/folder/xyz.jpg),但是我需要从 Java 代码中引用该文件夹(获取文件夹的路径,然后由用户上传文件)。我的用于上传的 Java REST 接口如下所示:

public class DictateUploadResource {

    public static final String UPLOADED_FILE_PARAMETER_NAME = "file";
    private final String UPLOAD_DIR = servletContext.getRealPath("/folder");


    @POST
    @Consumes("multipart/form-data")
    public Response uploadFile(MultipartFormDataInput input) {

        String path = servletContext.getRealPath("/folder");
        LOGGER.warn(">>>> sit back - starting file upload..." + path);

        Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
        List<InputPart> inputParts = uploadForm.get(UPLOADED_FILE_PARAMETER_NAME);

        for (InputPart inputPart : inputParts) {
            MultivaluedMap<String, String> headers = inputPart.getHeaders();
            String filename = getFileName(headers);


            try {
                InputStream inputStream = inputPart.getBody(InputStream.class, null);

                byte[] bytes = IOUtils.toByteArray(inputStream);

                LOGGER.info(">>> File '{}' has been read, size: #{} bytes", filename, bytes.length);
                writeFile(bytes, path + "/" + filename);
            } catch (IOException e) {
                return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
            }
        }
        return Response.status(Response.Status.OK).build();
    }

    /**
     * Build filename local to the server.
     *
     * @param filename
     * @return
     */
    private String getServerFilename(String path, String filename) {
        return path + "/" + filename;
    }

    private void writeFile(byte[] content, String filename) throws IOException {
        LOGGER.info(">>> writing #{} bytes to: {}", content.length, filename);
        File file = new File(filename);

        if (!file.exists()) {
            file.createNewFile();
        }

        FileOutputStream fop = new FileOutputStream(file);

        fop.write(content);
        fop.flush();
        fop.close();
        LOGGER.info(">>> writing complete: {}", filename);
    }

    /**
     * Extract filename from HTTP heaeders.
     *
     * @param headers
     * @return
     */
    private String getFileName(MultivaluedMap<String, String> headers) {
        String[] contentDisposition = headers.getFirst("Content-Disposition").split(";");

        for (String filename : contentDisposition) {
            if ((filename.trim().startsWith("filename"))) {

                String[] name = filename.split("=");

                String finalFileName = sanitizeFilename(name[1]);
                return finalFileName;
            }
        }
        return "unknown";
    }

    private String sanitizeFilename(String s) {
        return s.trim().replaceAll("\"", "");
    }

}

提前致谢!

【问题讨论】:

  • “别名在standalone.xml中设置”是什么意思?
  • 我将问题编辑得更清楚:)

标签: java upload wildfly


【解决方案1】:

最简单的解决方案是使用系统属性,因为path 属性允许表达式。然后在您的代码中检索该属性。

这是一个 CLI 示例:

/system-property=static.content.dir:add(value="/absolute/path/on/server")

然后换主机:

/subsystem=undertow/configuration=handler/file=folder:write-attribute(name=path, value="${static.content.dir}")

如果系统属性不可接受,您始终可以使用管理客户端并读取管理资源以获取名称。不过,系统属性是最简单的。

【讨论】:

  • 一切都搞定了,还是不行——写着“没有这样的文件或目录”……你确定你不需要添加一些特殊的权限来允许目录是可写的吗?跨度>
  • 运行 WildFly 进程的用户需要读取权限才能显示文件并需要写入权限才能写入文件。不过那是在操作系统方面。
【解决方案2】:

STEP # 1 : 在 Web 应用程序的 src 文件夹中创建配置文件

第 2 步:这是我的配置文件

第 3 步:现在我选择事件文件并获取与其相关的配置属性并从属性文件中读取 connectionURL

  InputStream propertiesInputStream = null;
  Properties properties = new Properties();
  propertiesInputStream = EventService.class.getClassLoader().getResourceAsStream("/config.properties");
  properties.load(propertiesInputStream);
  String connUrl = properties.getProperty("connectionUrl");

【讨论】:

  • 调用getParentFile() 特定次数似乎不是很干净。不应该有更清洁的解决方案吗?
  • 是的 getParentFile() 是详细的方法,我现在改变它
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2017-04-22
相关资源
最近更新 更多