首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java + Wildfly 9:使用部署应用程序外部的目录进行上载

Java + Wildfly 9:使用部署应用程序外部的目录进行上载
EN

Stack Overflow用户
提问于 2015-11-10 09:09:16
回答 2查看 2.7K关注 0票数 0

我正在开发web应用程序,并需要使上传文件的为用户提供可能。upload文件夹位于web应用程序- in openstack数据文件夹之外(在standalone.xml中设置)-示例:

代码语言:javascript
复制
    <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/文件夹/xyz.jpg),但是我需要引用代码中的文件夹(获取文件夹的路径,然后通过用户上传文件)。我的用于上传的Java接口如下所示:

代码语言:javascript
复制
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("\"", "");
    }

}

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2015-11-12 17:02:58

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

下面是一个CLI示例:

代码语言:javascript
复制
/system-property=static.content.dir:add(value="/absolute/path/on/server")

然后更改主机:

代码语言:javascript
复制
/subsystem=undertow/configuration=handler/file=folder:write-attribute(name=path, value="${static.content.dir}")

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

票数 0
EN

Stack Overflow用户

发布于 2021-01-21 05:14:25

步骤1:在web应用程序的src文件夹中创建配置文件

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

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

代码语言:javascript
复制
  InputStream propertiesInputStream = null;
  Properties properties = new Properties();
  propertiesInputStream = EventService.class.getClassLoader().getResourceAsStream("/config.properties");
  properties.load(propertiesInputStream);
  String connUrl = properties.getProperty("connectionUrl");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33626329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档