应用程序我正在使用户能够将图片拖到其上,然后将该图像一次复制到多个文件夹。 当我使用本地文件时,一切都很有效,但是我无法使用直接在网络浏览器上拖动的图像。
当然,图像保存在正确的文件夹中,但名称更改为带有.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
}
}
答案 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合作,所以我不在乎)