2017-02-23 8 views
0

Anwendung Ich mache den Benutzer Fähigkeit, Bild auf es ziehen und kopieren Sie dieses Bild dann in mehrere Ordner auf einmal. Alles funktioniert gut, wenn ich lokale Datei verwende, aber ich kann es nicht mit Bildern arbeiten, die vom Internetbrowser direkt auf dem Formular gezogen werden.Drag & Drop aus dem Internet-Browser (winforms)

Sicher, Bild wird in richtigen Ordnern gespeichert, aber der Name wird in Kauderwelsch mit der Endung .bmp geändert.

Zum Beispiel, wenn ich 100kb Bild mit dem Namen "image.jpg" aus dem Browser ziehen, bekomme ich 3MB Bild mit dem Namen "sInFeER.bmp". Ich teste es auf Firefox. Ich weiß, dass ich tatsächlich Bild vom temp-Faltblatt des Browsers kopiere, wenn ich das tue und Dateiname wird dort bereits geändert.

Wie kann ich in dieser Situation den korrekten Dateinamen und die korrekte Dateinamenerweiterung beibehalten? (Und vorzugsweise erhalten Bild zu großen BMP-Datei nicht konvertiert ...)

-Code Ich verwende für die Prüfung:

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

die App, von wo Sie das Bild ziehen, hat den Dateinamen geändert, so dass Ihre Winform App erhalten den ursprünglichen Dateinamen nicht mehr erhalten. – Roland

+0

Ja, es sieht so aus ... Aber wenn ich dasselbe Bild vom Browser auf den Desktop ziehe, ist der Dateiname und die Erweiterung identisch mit dem Original (aber ich denke, der Browser lädt hier). Vielleicht sollte ich WebClient.DownloadFile dann verwenden? So, jetzt ist die Frage, wie kann ich die URL-Adresse des gezogenen Bildes bekommen? – Legalt

+0

Ein Browser macht im Allgemeinen gezogene Objekte in mehreren Formaten verfügbar. Du warst glücklich mit DataFormats.FileDrop, also hast du das bekommen. Wenn Sie das Bild in Ihrem eigenen Bildformat speichern möchten, müssen Sie nach einem anderen Format suchen. Suchen Sie nach DataFormats.Bitmap und DataFormats.Dib. Letzteres ist etwas knifflig, Beispielcode [ist hier] (http://stackoverflow.com/a/11274109/17034). –

Antwort

0

Sieht aus wie Sie wurden Pixel von firefox zu Ihrer App ziehen, nicht die URL. Ich würde auf die mozilla site für weitere Informationen darüber, wie Sie die URL in Ihre App ziehen. Sie haben viel Programmiermaterial und APIs, um mit dem Browser zu interagieren.

+0

Danke, ich werde das definitiv lesen und versuchen, ihre API in Zukunft zu implementieren. – Legalt

0

Danke für alle Antworten.

Ich habe etwas gelesen und entschieden, dass der Zugriff auf das Originalbild beim Ziehen aus dem Browser (Firefox) ziemlich unmöglich ist (ohne Verwendung von Firefox API), also habe ich WebClient.DownloadFile verwendet, um verlorenes Bild herunterzuladen.

Hier ist der Code I endete mit:

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; 
     } 

Es gibt wohl bessere Weise, dies zu tun, aber das funktioniert für mich. Scheint nicht mit anderen Browsern zu funktionieren. (aber ich brauchte es nur, um mit Firefox zu arbeiten, so ist es mir egal)