23. 05. 2013, 16:48

Moin moin!

Ich habe soeben eine Kundenseite von TYPO3 4.2 auf 6.1 aktualisiert. Das lief soweit auch ohne Probleme. Nun musste ich feststellen, dass bei Seiteninhalt vom Typ Dateilinks keine Dateien mehr hinterlegt sind. In der Datenbank sind allerdings noch alle Dateinamen im Feld tt_content.media vorhanden. Also dachte ich mir, gehst du nochmal ins Installations-Tool in den Upgrade-Wizard und führst "Migrate all file relations from tt_content.image and pages.media" aus. Aber Pustekuchen! Die Dateien die im Feld tt_content.media hinterlegt sind werden nicht beachtet (was der der Titel "Migrate all file relations from tt_content.image and pages.media" ja eigentlich auch schon suggeriert). Nun habe ich aber weder Zeit noch Lust alle Seiten durchzugehen und das manuell nachzuziehen..

Wie seid ihr das Problem angegangen oder hattet ihr das Problem garnicht? Ich wäre über jede hilfreiche Antwort sehr erfreut!

Vielen Dank

[b]Edit:[/b] Da leider keine Antwort kam habe ich mir einfach Quick & Dirty ein Skript geschrieben, das die Arbeit für mich erledigt. Ich hoffe einfach mal, dass es in zukünftigen Versionen von TYPO3 einen sauberen Weg geben wird.

Für alle mit dem selben Problem, hier das Skript (ich übernehme keine Haftung für auftretene Probleme ;)):

  1. <?php
  2. $connection = mysqli_connect('localhost', 'username', 'password', 'database');
  3.  
  4. $result = mysqli_query($connection, 'SELECT uid, pid, media FROM tt_content WHERE media IS NOT NULL AND media <>\'\' AND media NOT REGEXP \'^-?[0-9]+$\'');
  5.  
  6. while ( $row = mysqli_fetch_array($result) ) {
  7. $media_array = explode(',', $row['media']);
  8.  
  9. foreach ($media_array as $media_value) {
  10.  
  11. if ( file_exists($_SERVER['DOCUMENT_ROOT'] . 'uploads/media/' . $media_value) ) {
  12. if ( rename($_SERVER['DOCUMENT_ROOT'] . 'uploads/media/' . $media_value, $_SERVER['DOCUMENT_ROOT'] . 'fileadmin/_migrated/media/' . $media_value) ) {
  13.  
  14. $media_data['path'] = $_SERVER['DOCUMENT_ROOT'] . 'fileadmin/_migrated/media/' . $media_value;
  15.  
  16. $media_data['identifier'] = '/_migrated/media/' . $media_value;
  17. $media_data['extension'] = strtolower(pathinfo($media_data['path'], PATHINFO_EXTENSION));
  18. $media_data['mime_type'] = mime_content_type($media_data['path']);
  19. $media_data['name'] = pathinfo($media_data['path'], PATHINFO_BASENAME);
  20. $media_data['sha1'] = sha1_file($media_data['path']);
  21. $media_data['size'] = filesize($media_data['path']);
  22. $media_data['creation_date'] = filectime($media_data['path']);
  23. $media_data['modification_date'] = filemtime($media_data['path']);
  24. list($media_data['width'], $media_data['height']) = getimagesize($media_data['path']);
  25. if ( !$media_data['width'] ) $media_data['width'] = 0;
  26. if ( !$media_data['height'] ) $media_data['height'] = 0;
  27.  
  28. switch ($media_data['extension']) {
  29. case 'html':
  30. $media_data['type'] = 1;
  31. break;
  32. case 'jpg':
  33. case 'jpeg':
  34. case 'png':
  35. case 'gif':
  36. case 'bmp':
  37. $media_data['type'] = 2;
  38. break;
  39. case 'flv':
  40. $media_data['type'] = 4;
  41. break;
  42. case 'pdf':
  43. $media_data['type'] = 5;
  44. break;
  45. }
  46.  
  47. mysqli_query($connection, 'INSERT INTO sys_file (tstamp, crdate, type, storage, identifier, extension, mime_type, name, sha1, size, creation_date, modification_date, width, height) VALUES (' . time() . ', ' . time() . ', ' . $media_data['type'] . ', 1, \'' . $media_data['identifier'] . '\', \'' . $media_data['extension'] . '\', \'' . $media_data['mime_type'] . '\', \'' . $media_data['name'] . '\', \'' . $media_data['sha1'] . '\', ' . $media_data['size'] . ', ' . $media_data['creation_date'] . ', ' . $media_data['modification_date'] . ', ' . $media_data['width'] . ', ' . $media_data['height'] . ')');
  48. mysqli_query($connection, 'INSERT INTO sys_file_reference (pid, tstamp, crdate, uid_local, uid_foreign, tablenames, fieldname, table_local) VALUES (' . $row['pid'] . ', ' . time() . ', ' . time() . ', ' . mysqli_insert_id($connection) . ', ' . $row['uid'] . ', \'tt_content\', \'media\', \'sys_file\')');
  49. mysqli_query($connection, 'UPDATE tt_content SET media = ' . count($media_array) . ' WHERE uid = ' . $row['uid']);
  50. }
  51. }
  52. }
  53. }