我正在尝试让应用程序接受从Gmail网页拖入的附件。
但是,当我拖动附件时,直接从网站e.Data确实也没有以任何方式包含数据。
.S
e.Data的类型为DataObject。 FileDrop,FileNameW,FileName为null DragContext,DragImageBits,chromium / x-renderer-taint是System.IO.MemoryStream
非Memorystream对象包含拖入附件的任何文件数据。 也没有任何下载URL。
修改。 显然,当拖动图片附件时,数据会保留URL。 但其他附件,不带URL 但是当我将它拖到桌面时,Windows资源管理器知道在哪里下载它,所以必须有一种方法来检索这个URL。
EDIT2 添加使用Immediate Window for DataObject查看的数据
private void Form1_DragDrop(object sender, DragEventArgs e)
{
string[] dataFormats = e.Data.GetFormats();
Type type = e.Data.GetType();
}
答案 0 :(得分:0)
附件被检测为FileDrop,数据包含附件的URL,可以通过GetData(DataFormats.Text)来检索。
以下是一些示例代码供您尝试:
private void Form1_DragDrop(object sender, DragEventArgs e) {
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files == null) {
string url = (string)e.Data.GetData(DataFormats.Text);
MessageBox.Show(url);
}
}
private void Form1_DragEnter(object sender, DragEventArgs e) {
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
e.Effect = DragDropEffects.Copy;
}
}
请注意,处理DragEnter事件并将e.Effect设置为DragDropEffects.Copy非常重要,否则DragDrop事件将不会触发,也不会拥有所需的数据。
答案 1 :(得分:0)
最新的Gmail网络应用已实施安全性,现在它不允许您获取像图片这样的直接文件网址。我的目的是向你提供我所做的一些解释。
我更深入地研究了它,并在立即窗口中调试期间尝试了一些代码并发现..
获取DataObject
(e.Data as System.Windows.DataObject).GetFormats(false);
{string[13]}
[0]: "DragContext"
[1]: "DragImageBits"
[2]: "chromium/x-renderer-taint"
[3]: "FileDrop"
[4]: "UnicodeText"
[5]: "Text"
[6]: "text/x-moz-url"
[7]: "FileGroupDescriptorW"
[8]: "FileContents"
[9]: "UniformResourceLocatorW"
[10]: "UniformResourceLocator"
[11]: "HTML Format"
[12]: "text/html"
然后我尝试从中获取Text
格式数据
(e.Data as System.Windows.DataObject).GetDataPresent("Text");
true
(e.Data as System.Windows.DataObject).GetData("Text");
"https://mail.google.com/mail/u/0/?ui=X&ik=XXXXXXXXXXX&view=att&th=XXXXXXXXXX&attid=0.1&disp=inline&safe=1&zw"
所以这只是你附件的网址。当我试图直接在浏览器上点击此URL时,我重定向到附件文件。 (您必须使用谷歌帐户登录浏览器)
最后我尝试了以下选项
(e.Data as System.Windows.DataObject).GetData("HTML Format");
我得到了一些查询字符串和html的字符串。在HTML中,您可以轻松找到文件名(临时)和文件的扩展名。
我想在此证明这一点,或者我建议您使用的方法是,一旦获得附件文件的URL。您可以对网址进行简单的网络服务电话/ Google API调用,然后下载该文件作为回应。
注意:以上提及的所有代码都来自Visual Studio立即窗口,因此它是我执行的代码和返回的输出的组合。