拖拽从互联网浏览器中删除(winforms)

时间:2017-02-23 13:33:04

标签: c# winforms browser drag-and-drop

应用程序我正在使用户能够将图片拖到其上,然后将该图像一次复制到多个文件夹。 当我使用本地文件时,一切都很有效,但是我无法使用直接在网络浏览器上拖动的图像。

当然,图像保存在正确的文件夹中,但名称更改为带有.bmp扩展名的乱码。

例如,当我拖动100kb图像时,名称为" image.jpg"从浏览器我得到3mb图像的名称" sInFeER.bmp"。我在Firefox上测试它。我知道当我这样做时,我实际上是从浏览器临时文件夹中复制图像,文件名已在那里更改。

在这种情况下,如何保留正确的文件名和扩展名? (并且最好将图像转换为巨大的bmp文件...)

代码I用于测试:

private void button10_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
            {
                e.Effect = DragDropEffects.All;
            }
        }

private void button10_DragDrop(object sender, DragEventArgs e)
        {
            string[] draggedFiles = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            CatchFile(0, draggedFiles);
        }

private void CatchFile(int id, string[] draggedFiles)
        {
            string directory = @”C:\test\”;

            foreach (string file in draggedFiles)
            {
                Directory.CreateDirectory(directory);
                File.Copy(file, directory + Path.GetFileName(file));

                MessageBox.Show(Path.GetFileName(file)); // test
            }
        }

1 个答案:

答案 0 :(得分:0)

感谢所有答案。

我已经完成了一些阅读,并决定从浏览器(Firefox)拖动时访问原始图像几乎是不可能的(不使用Firefox API),所以我只是使用WebClient.DownloadFile来下载丢失的图片。

以下是我结束的代码:

private void button10_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
            {
                e.Effect = DragDropEffects.All;
            }
        }

        private void button10_DragDrop(object sender, DragEventArgs e)
        {
            string draggedFileUrl = (string)e.Data.GetData(DataFormats.Html, false);
            string[] draggedFiles = (string[])e.Data.GetData(DataFormats.FileDrop, false);

            CatchFile(draggedFiles, draggedFileUrl);
        }

        private void CatchFile(string[] draggedFiles, string draggedFileUrl)
        {
            string directory = @"C:\test\";

            foreach (string file in draggedFiles)
            {
                Directory.CreateDirectory(directory);

                if (string.IsNullOrEmpty(draggedFileUrl))
                {
                    if (!File.Exists(directory + Path.GetFileName(file))) File.Copy(file, directory + Path.GetFileName(file));
                    else
                    {
                        MessageBox.Show("File with that name already exists!");
                    }
                }
                else
                {
                    string fileUrl = GetSourceImage(draggedFileUrl);
                    if (!File.Exists(directory + Path.GetFileName(fileUrl)))
                    {
                        using (var client = new WebClient())
                        {
                            client.DownloadFileAsync(new Uri(fileUrl), directory + Path.GetFileName(fileUrl));
                        }
                    }
                    else
                    {
                        MessageBox.Show("File with that name already exists!");
                    }
                }

                // Test check:
                if (string.IsNullOrEmpty(draggedFileUrl)) MessageBox.Show("File dragged from hard drive.\n\nName:\n" + Path.GetFileName(file));
                else MessageBox.Show("File dragged frow browser.\n\nName:\n" + Path.GetFileName(GetSourceImage(draggedFileUrl)));
            }
        }

        private string GetSourceImage(string str)
        {
            string finalString = string.Empty;
            string firstString = "src=\"";
            string lastString = "\"";

            int startPos = str.IndexOf(firstString) + firstString.Length;
            string modifiedString = str.Substring(startPos, str.Length - startPos);
            int endPos = modifiedString.IndexOf(lastString);
            finalString = modifiedString.Substring(0, endPos);

            return finalString;
        }

可能有更好的方法,但这对我有用。似乎不能与其他浏览器一起使用。 (但我只需要与Firefox合作,所以我不在乎)