2013-05-19 1 views
-1

Я пытаюсь сделать функцию загрузки, которая добавляет водяной знак к каждому файлу, загруженному в память, а затем сохраняет файлы в определенную папку. Однако я не могу заставить компонент водяного знака работать. Я точно знаю, что функции загрузки работают без добавления кода водяного знака. Я считаю, что ошибка должна быть там, где код водяного знака «переносит» временный файл на код, который перемещает файл на жесткий диск. Как я могу исправить эту проблему?Добавить водяной знак в файл во время загрузки

Код выглядит следующим образом:

foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){ 

      $file_name = $_FILES['files']['name'][$key]; 
      $file_size =$_FILES['files']['size'][$key]; 
      $file_tmp =$_FILES['files']['tmp_name'][$key]; 
      //$file_type=$_FILES['files']['type'][$key];  

      //if($file_size > 2097152){ 

       //$errors[]='File size must be less than 2 MB'; 
      //} 
      // echo '<img src="../images/watermark.gif">'; 

      $q = "INSERT INTO media (file_name, album_id, file_size) VALUES ('$file_name','$album_id', '$file_size')"; 

      $r = mysqli_query ($dbc, $q); 

      $desired_dir = '../../customers/' . $customerFolder . '/'; 

      // load the watermark and the photo 
      $watermark = imagecreatefromgif('../images/watermark.gif'); 
      $photo = imagecreatefromjpeg($file_tmp); 

      // center watermark on the photo 
      $wx = imagesx($photo)/2 - imagesx($watermark)/2; 
      $wy = imagesy($photo)/2 - imagesy($watermark)/2; 

      imagecopy($photo, $watermark, $wx, $wy, 0, 0, imagesx($watermark), imagesy($watermark)); 

      if(empty($errors)==true){ 

        move_uploaded_file($photo,"$desired_dir".$file_name); 

       //mysql_query($q); 

      }else{ 
       print_r($errors); 
      } 
     } 
+0

Что именно не работает? –

+0

Осторожно ... вы потенциально открыли себя атакам SQL-инъекций. Используйте подготовленные/параметризованные запросы с PDO или аналогичными. Кроме того, если этот '$ customerFolder' поступает от пользователя, убедитесь, что конечный путь находится только в каталоге, в котором вы хотите. Не позволяйте пользователю указывать имя файла. Не вмешивайся в докровать. В противном случае, нечего загружать 'something-evil.php' и запускать его удаленно. – Brad

+0

также избегать использования «../../» – MarZab

ответ

0

Вы пытаетесь использовать move_uploaded_file с resource переменной.

move_uploaded_file принимает строку, являющуюся абсолютным путем во временный файл.

, так как вы уже прочитали временный файл в качестве ресурса, вы можете просто написать ресурс на диск:

imagejpeg($photo,$desired_dir.$file_name); 

временные файлы очищаются автоматически.

1

я придумал следующее решение:

// Load the stamp and the photo to apply the watermark to 
$stamp = imagecreatefromgif('../images/watermark.gif'); 

$marge_right = 10; 
$marge_bottom = 10; 
$sx = imagesx($stamp); 
$sy = imagesy($stamp); 

if(isset($_FILES['files'])){ 

     $errors= array(); 

     foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){ 

      $file_name = $_FILES['files']['name'][$key]; 
      $file_size =$_FILES['files']['size'][$key]; 
      $file_tmp =$_FILES['files']['tmp_name'][$key]; 
      $file_type=$_FILES['files']['type'][$key]; 

      //if($file_size > 2097152){ 

       //$errors[]='File size must be less than 2 MB'; 
      //} 
      // echo '<img src="../images/watermark.gif">'; 

      $q = "INSERT INTO media (file_name, album_id, file_size) VALUES ('$file_name','$album_id', '$file_size')"; 

      $r = mysqli_query ($dbc, $q); 

      $desired_dir = '../../customers/' . $customerFolder . '/'; 

      $im = imagecreatefromjpeg($file_tmp); 

      imagecopymerge($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp), 50); 

      $newPath = "$desired_dir".$file_name; 

      imagepng($im, $newPath); 

      if(empty($errors)==true){ 

        move_uploaded_file($newPath,"$desired_dir".$file_name); 
        imagedestroy($im); 
       //mysql_query($q); 

      }else{ 
       print_r($errors); 
      } 
     } 

     if(empty($error)){ 
      return 'ok'; 

     }else { 
      return 'Kunne ikke uploade!'; 
     } 
    }