资源文件路径为字符串(不是流式传输)

时间:2016-03-05 17:27:38

标签: java string maven path resources

我没理解 - 我正在尝试获取文件的路径,以便文件(图像)可以作为附件包含在电子邮件中。

我的系统由两部分组成 - 一个Web应用程序和一个jar。 (实际上是三个部分 - 一个包含DAO的常见共享jar等。)

他们都是用maven建造的。 它们都在此路径中包含此图像:

的src /主/资源/ logo_48.png

Web应用程序:

String logo1 = getClass().getClassLoader().getResource("logo_48.png").getPath();

这在本地(Windows)和Linux上都很完美 -

Jar应用程序:

String logo1 = getClass().getClassLoader().getResource("logo_48.png").getPath();    //doesn't work

我从这里接受了建议: How to access resources in JAR file? 这里: Reading a resource file from within jar 这里: http://www.coderanch.com/t/552720/java/java/access-text-file-JAR

和其他人

大多数答案都提供将文件作为流等加载,但我只希望获得分配给String的路径。其他资源让我在几个小时内破解代码只是为了找到最终结果不起作用。

在如此多的/home/kalton/daily.jar!logo_48.png实例不存在错误后,我感到很沮丧,并采取了以下解决方法:

将logo_48.png直接复制到jar所在的文件夹(/ home / kalton /)

将我的jar应用程序代码更改为:

String logo1 = "/home/kalton/logo_48.png";

它有效。

有没有人能告诉我从未解包的JAR获取资源文件夹中文件的PATH(作为字符串)的正确方法? 这个问题让我疯狂了好几个星期! 提前致谢。 KA。

添加“路径”的实际使用代码以明确使用:

public static MimeMultipart assemble4SO(String logoTop, String emailHTMLText) throws MessagingException, IOException {
    MimeMultipart content = new MimeMultipart("related");
    String cid = Long.toString(System.currentTimeMillis());
    String cidB = cid + "b";
    String cssStyle = "";

    String body = "<html><head>" + cssStyle + "</head><body><div>" + "<img src='cid:" + cid + "'/>" + emailHTMLText + "<img src='cid:" + cidB + "'/></div></body></html>";
    MimeBodyPart textPart = new MimeBodyPart();

    textPart.setContent(body, "text/html; charset=utf-8");
    content.addBodyPart(textPart);

    //add an inline image
    MimeBodyPart imagePart = new MimeBodyPart();
    imagePart.attachFile(logoTop);
    imagePart.setContentID("<" + cid + ">");
    imagePart.setDisposition(MimeBodyPart.INLINE);
    content.addBodyPart(imagePart);

.............

1 个答案:

答案 0 :(得分:1)

从顶部......

.jar文件实际上是一个zip文件。 zip文件是用作存档的单个文件。此存档中的条目不是单独的文件,它们只是zip文件中的压缩字节序列。它们不能作为单独的文件名或File对象访问。

同样重要的是:网址类getPath方法不会将网址转换为文件名。它返回URL的路径部分,它只是主机之后(以及任何查询和/或片段之前)的部分。许多字符在URL中是非法的,并且需要使用百分比编码进行“转义”,因此如果您只是直接从URL中提取路径,您通常会得到包含percent-escapes的内容,因此它不是有效的文件完全是名字。

一些例子:

String path = "C:\\Program Files";

URL url = new File(path).toURI().toURL();
System.out.println(url);            // prints file:/C:/Program%20Files
System.out.println(url.getPath());  // prints /C:/Program%20Files

File file = new File(url.getPath());
System.out.println(file.exists());  // prints false, because
                                    // "Program%20Files" ≠ "Program Files"

String path = "C:\\Users\\VGR\\Documents\\résumé.txt";

URL url = new File(path).toURI().toURL();

// Prints file:/C:/Users/VGR/Documents/r%C3%A9sum%C3%A9.txt
System.out.println(url);

// Prints /C:/Users/VGR/Documents/r%C3%A9sum%C3%A9.txt
System.out.println(url.getPath());

File file = new File(url.getPath());
System.out.println(file.exists());  // prints false, because
                                    // "r%C3%A9sum%C3%A9.txt" ≠ "résumé.txt"

根据你的编辑,我看到你想要一个字符串的真正原因是你可以调用MimeBodyPart.attachFile。您有两种选择:

  1. 自己完成attachFile的工作:

    URL logo = getClass().getLoader().getResource("logo_48.png");
    imagePart.setDataHandler(new DataHandler(logo));
    imagePart.setDisposition(Part.ATTACHMENT);
    
  2. 将资源复制到临时文件,然后传递该文件:

    Path logoFile = Files.createTempFile("logo", ".png");
    try (InputStream stream =
        getClass().getLoader().getResourceAsStream("logo_48.png")) {
    
        Files.copy(stream, logoFile, StandardCopyOption.REPLACE_EXISTING);
    }
    imagePart.attachFile(logoFile.toFile());
    
  3. 如您所见,第一个选项更容易。第二个选项还需要清理临时文件,但是在发送消息之前你不想这样做,这可能需要使用TransportListener。