Написание собственного jQuery -утилиты для загрузки изображений на PHP для сайта

#php #jquery #file-upload

#php #jquery #загрузка файла

Вопрос:

После нескольких недель поиска и полного смущения учебными пособиями, которые уже были в книгах, я решил написать свой собственный скрипт загрузки jQuery. Я думал, что смогу заставить ее работать, но у меня возникли проблемы. Я перечислю их:

На странице, для которой я пишу это, я разместил скрипт jQuery, который выглядит примерно так:

 $(document).ready(function() {
  var thumb = $('#thumb');  

  $('#profilepicinput').live('change', function(){
    $("#preview").html('');
    $("#preview").html('<img src="loader.gif" alt="Uploading...."/>');
    $("#registerpt3").ajaxForm({
      target: $('#registerpt3').attr('action')
    }).submit();
  });

  $('#profilepicbutton').change(function(){
    alert("Boy I hate PHP");
    $.ajax({
      type: "POST",
      url: "register3.php",
      success: function(msg) {
        alert( "Data Saved: "   msg );
        $.ajax({
          type: "POST",
          url: "retrievePic.php",
          success: function(msg) {
            var image = new Image();
            $(image).load(function(){
              console.log("we have uploaded this image");
            }).attr('src', 'images/');
            alert("AJAX Success!");
          },
          error: function(msg) {
            alert(" didn't work");
          }
        });
      },
      error:function(msq){
        alert("didn't work!: "   msg);
      }
    });
  });
});
  

Это вызывает следующий скрипт, который загрузит изображение в базу данных:

 <?php 

session_start();

$email = '';

if (isset($_SESSION['user_email'])) {
  $email = $_SESSION['user_email'];
} else {
  $email = 'dww2@pitt.edu';
}

$link = mysql_connect('censcoredFool.com', 'greetmeet', 'Maverick$41'); 

mysql_select_db(first_1) or die("Opps, You are pretty Got-Damned Stupid!  Did you         realize that?!?!?");

$target = './Uploads/'; 
$target = $target . basename( $_FILES['uploaded']['name']); 

$ok = 1; 

$path = "uploads/";
$Email = $_SESSION['user_email'];
$valid_formats = array("jpg", "png", "gif", "bmp","jpeg");

if (isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") {
  $name = $_FILES['photoimg']['name'];
  $size = $_FILES['photoimg']['size'];

  if (strlen($name)) {
    list($txt, $ext) = explode(".", $name);
    if (in_array($ext,$valid_formats)) {
      if ($size<(1024*1024)) { // Image size max 1 MB
        $actual_image_name = time().$session_id.".".$ext;
        $tmp = $_FILES['photoimg']['tmp_name'];
        if (move_uploaded_file($tmp, $path.$actual_image_name)) {
          mysql_query("insert into personal_photos      (Email, Pics) values('$email', '$tmp')");
          echo "<img   src='uploads/".$actual_image_name."' class='preview'>";
        } else {
          echo "failed";
        }
      } else {
        echo "Image file size max 1 MB";
      }
    } else {
      echo "Invalid file format..";
    }
  } else {
    echo "Please select image..!";
  }

  exit;
}
  

То, что у меня есть, похоже, даже не работает. Я получаю сообщение об успешном завершении, но изображение даже не загружается. Я предполагаю, что PHP-скрипт прошел весь путь, но не выдал исключение или что-то в этом роде. Как мне заставить эту штуку работать?

ОБНОВЛЕНИЕ: после запуска Firebug мой PHP-скрипт не получает изображение, не уверен, почему это так. Нужно выяснить, как работает структура данных $ _File.

Комментарии:

1. потрясающие сообщения об ошибках. Убедитесь, что вы не оставляете их, когда отправляете свой код своему клиенту.

2. Извините, пожалуйста. Просто шучу с моим братом.

3. «После нескольких недель поиска и полного смущения учебными пособиями, которые уже были в книгах, я решил написать свой собственный скрипт загрузки jQuery». Я в замешательстве. Вы не смогли заставить учебные пособия работать, поэтому решили написать их с нуля? Это вряд ли кажется хорошей идеей.

Ответ №1:

Большинство браузеров не будут отправлять файлы через ajax в целях безопасности. Чтобы создать эффект pretend-ajax при загрузке, вы можете попробовать отличный плагин jQuery form, который использует скрытый iframe для выполнения загрузки.

Поскольку это пока единственный ответ — и он также правильный — позвольте мне дать вам несколько советов OT:

  • Большинству людей, использующих PHP, нравится PHP (больше вещей на небесах и на Земле, Горацио). Большинство из них воспримут ваше «PHP отстой» как довольно претенциозное высказывание, поскольку ваша проблема больше связана с отсутствием базовых знаний о реализациях Ajax и http, чем с недостатками языка. Таким образом, отсутствие ответов и нежелательных комментариев.

  • Ваше остроумие меня отвлекает: пожалуйста, сделайте вывод отладки в коде, который вы публикуете, как можно более описательным — на самом деле, было бы полезно просто написать описательный вывод в любом случае — так легче находить проблемы, поверьте мне.

  • Если форма состоит из ста полей, и только одно является релевантным, пожалуйста, разместите только соответствующее поле.

Комментарии:

1. Большой 1. Мы уже рассказывали ему об AJAX и файлах в прошлой теме, но, возможно, на этот раз это пройдет.

2. @ceejayoz Я тоже на это надеюсь — увидел другой пост слишком поздно. Я думаю, что часть плагина сделает это.

Ответ №2:

В целях безопасности JavaScript обычно не может получить доступ к файлам на вашем жестком диске. Вот почему AJAX часто не подходит для загрузки. (хотя это могло измениться в современных браузерах).

Что люди использовали для загрузки файлов, так это:

  • iFrame. Вам нужно создать невидимый iframe и отправить форму с вашей формой загрузки, нацеленной на этот iframe. Ваша страница не будет обновляться, и вы даже можете выполнить некоторый javascript из этого фрейма.
  • Flash. Использование flash uploader позволяет отправлять несколько файлов.

Хотя, вам, вероятно, лучше использовать некоторые из существующих библиотек / методов загрузки. Я написал свой собственный загрузчик, и это непростая задача.

Комментарии:

1. Я имею в виду, это все хорошо, но как я могу улучшить свой скрипт?

2. Это не форум для проверки кода. Вам нужно будет улучшить свой скрипт, не пытаясь загружать файлы через AJAX, что не сработает , как указал @romaninsh в своем ответе.

3. Я вызываю функцию php, которая должна загрузить файл? Почему это не сработает?

4. Потому что вы вызываете эту функцию PHP через JavaScript вместо отправки обычной формы POST. По соображениям безопасности JavaScript не может получить доступ к полям загрузки файлов в большинстве (я полагаю, во всех основных) браузерах. Опять же, это в ответе @romaninsh.

5. ^^^ что с этим valumns.com/ajax-upload сценарий… ajaxupload.js сценарий нигде не найти, и у меня нет времени расшифровывать остальную часть его сценария.