将Gmail附件拖到c#winform

时间:2018-02-18 08:11:15

标签: c# drag-and-drop

我正在尝试让应用程序接受从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();
    }

2 个答案:

答案 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立即窗口,因此它是我执行的代码和返回的输出的组合。