我创建了一个Java应用程序,用户可以在其中拖放文件以将其保存到指定的文件夹中。我使用的是FileDrop
,不幸的是,它不能直接从Outlook中拖放电子邮件。当电子邮件先放到桌面上(创建一个. email文件),然后放到应用程序中时,它就可以工作了,但是我真的想绕过这一步。
你可以在下面看到我的代码:
new FileDrop(panel, new FileDrop.Listener() {
public void filesDropped(java.io.File[] files) {
for (int i=0; i<files.length; i++) {
File newFile = files[i];
byte[] myByteArray = null;
try { //get the data of the file into a byte array
myByteArray = org.apache.commons.io.FileUtils.readFileToByteArray(newFile);
} catch (IOException e1) {
e1.printStackTrace();
}
String newFileName = newFile.getName();
try { //create the file
FileOutputStream file = new FileOutputStream("projects/"+ newFileName);
file.write(myByteArray);
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
我很想听听这个问题的任何可能的解决方案。
顺便说一下,这是我得到的错误消息的一部分,指出问题发生在public void filesDropped(java.io.File[] files) {
行,因为被放入应用程序的电子邮件尚未被识别为文件(我猜)。
...
2015-06-04 12:10:50.860 java[718:71442] Couldn't get a copy of an HFS Promise from the pasteboard
2015-06-04 12:10:50.860 java[718:71442] Looked for HFSPromises on the pasteboard, but found none.
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(File.java:363)
at net.iharder.dnd.FileDrop.createFileArray(FileDrop.java:453)
...
Outlook提供了一个包含以下信息的FileDescriptor:
- 掉落物品数量
- 对于每个项目:文件名(例如Test。msg + IDataObject),它指向一个存储
- 每个拖拽项目有一个存储
- 存储将是一个虚拟文件系统,根据MS复合文件规范(在MS Office中使用-例如。xls,。doc,也有。msg)。
- IStorage类似于文件/文件夹结构,文件夹由IStorage对象表示,文件由IStreams 表示。在IStream中,人们会发现电子邮件的实际内容,如:
- 主题/gh>接受者
- 电子邮件正文
- 附件
- <
我也很纠结于Outlook通过拖放界面传递二进制文件的假设。由于与其他Office程序的互操作性,Outlook传递复合文件结构。所以我们需要把这些东西混在一起。如果将从Outlook接收到的元素保存到文件中,这将不是1:1,就像从Outlook导出到磁盘一样(二进制相同),而是具有相同内容的文件。
对于完整的解决方案,方法如下:
- Get File Descriptor
- 对于每个文件get
- IDataObject指针
- 从IDataObject获取根存储
- 迭代存储的子元素
- 如果子元素是IStream,则处理IStream
- 如果子元素是一个存储,递归地返回到"迭代子元素"
- 迭代存储的子元素
使它变得复杂的是Win32 OLE的接口,它使用指针。此外,如果要进入错误,接口返回类型就不那么容易解释了。
更多细节,请在这篇文章中找到我的答案:我可以将项目从Outlook拖到SWT应用程序中吗?
我创建了一个小库,为Outlook项目提供SWT传输类型。你可以在GitHub上找到它:https://github.com/HendrikHoetker/OutlookItemTransfer
希望这对你有帮助,如果你有更多的问题,请在下面留言。