Работа с textarea
Нашел скрипт для управления веб-камерой, все работает, все замечательно, но возникла проблема с добавлением описания к сделанным фото. Дело с том, что после того, как предварительно захватив изображение, появляются кнопки "переснять" и "сохранить", я попытался добавить еще элемент формы textarea, но вот собственно сам текст не удается обработать, пытался передавать его обычным POST, но думаю php тут не обойтись, а js у меня плоховато:( Может кто-нибудь подскажет, поможет как это сделать?
$(document).ready(function(){
var camera = $('#camera'),
photos = $('#photos'),
screen = $('#screen');
var template = '<a href="uploads/original/{src}" rel="cam" '
+'style="background-image:url(uploads/thumbs/{src})"></a>';
/*----------------------------------
Установки веб камеры
----------------------------------*/
webcam.set_swf_url('assets/webcam/webcam.swf');
webcam.set_api_url('upload.php'); // Скрипт загрузки
webcam.set_quality(80); // Качество фотографий JPEG
webcam.set_shutter_sound(true, 'assets/webcam/shutter.mp3');
// Генерируем код HTML для камеры и добавляем его на страницу:
screen.html(
webcam.get_html(screen.width(), screen.height())
);
/*------------------------------
Обработчики событий
-------------------------------*/
var shootEnabled = false;
$('#shootButton').click(function(){
if(!shootEnabled){
return false;
}
webcam.freeze();
togglePane();
return false;
});
$('#cancelButton').click(function(){
webcam.reset();
togglePane();
return false;
});
$('#uploadButton').click(function(){
webcam.upload();
webcam.reset();
togglePane();
return false;
});
camera.find('.settings').click(function(){
if(!shootEnabled){
return false;
}
webcam.configure('camera');
});
// Показываем и скрываем панель камеры:
var shown = false;
$('.camTop').click(function(){
$('.tooltip').fadeOut('fast');
if(shown){
camera.animate({
bottom:-466
});
}
else {
camera.animate({
bottom:-5
},{easing:'easeOutExpo',duration:'slow'});
}
shown = !shown;
});
$('.tooltip').mouseenter(function(){
$(this).fadeOut('fast');
});
/*----------------------
Возвратные вызовы
----------------------*/
webcam.set_hook('onLoad',function(){
// Когда FLASH загружен, разрешаем доступ
// к кнопкам "Снимаю" и "Установка"
shootEnabled = true;
});
webcam.set_hook('onComplete', function(msg){
// Данный ответ возвращается upload.php
// и содержит имя изображения в формате объекта JSON
msg = $.parseJSON(msg);
if(msg.error){
alert(msg.message);
}
else {
// Добавляем его на страницу
photos.prepend(templateReplace(template,{src:msg.filename}));
initFancyBox();
}
});
webcam.set_hook('onError',function(e){
screen.html(e);
});
Далее получаем jpeg-файл
<?php
session_start();
include ("blocks/bd.php");
/*
Данный скрипт получает снимок JPEG
из webcam.swf как запрос POST.
*/
// Нам нужно обрабатывать только запрос POST:
if(strtolower($_SERVER['REQUEST_METHOD']) != 'post'){
exit;
}
$folder = 'uploads/';
$filename = md5($_SERVER['REMOTE_ADDR'].rand()).'.jpg';
$original = $folder.$filename;
// Снимок JPEG отправляется в необработанном виде:
$input = file_get_contents('php://input');
if(md5($input) == '7d4df9cc423720b7f1f3d672b89362be'){
// Черное изображение. Нам оно без надобности.
exit;
}
$result = file_put_contents($original, $input);
if (!$result) {
echo '{
"error" : 1,
"message" : "Ошибка сохранения изображения. Убедитесь, что папка uploads и ее вложенные каталоги имеет chmod 777."
}';
exit;
}
$info = getimagesize($original);
if($info['mime'] != 'image/jpeg'){
unlink($original);
exit;
}
// Перемещаем временный файл в оригинальную папку:
rename($original,'uploads/original/'.$filename);
$original = 'uploads/original/'.$filename;
// Используем библиотеку GD для изменения размера
// для миниатюры:
$w = 260;
$origImage = imagecreatefromjpeg($original);
$w_src = imagesx($origImage);
$h_src = imagesy($origImage);
$newImage = imagecreatetruecolor($w,$w);
imagecopyresampled($newImage,$origImage,0,0,round((max($w_src,$h_src)-min($w_src,$h_src))/2),0,$w,$w,min($w_src,$h_src),min($w_src,$h_src));
imagejpeg($newImage,'uploads/thumbs/'.$filename);
$date = date("Y-m-d");
$result = mysql_query ("INSERT INTO photos (id_user,photo,p_date) VALUES('$_SESSION[id]','$filename','$date')");
echo '{"status":1,"message":"Success!","filename":"'.$filename.'"}';
?>
в таблице photos есть еще одно поле description, в него то и хотел записывать текст из textarea |
А в какой строчке происходят манипуляции с текстарией? Чет не вижу.
|
изначально скрипт без нее. вот я и хочу узнать, как можно ее туда прикрутить?
вот в это место, я думаю:
$('#shootButton').click(function(){
if(!shootEnabled){
return false;
}
webcam.freeze();
togglePane();
return false;
});
$('#cancelButton').click(function(){
webcam.reset();
togglePane();
return false;
});
$('#uploadButton').click(function(){
webcam.upload();
webcam.reset();
togglePane();
return false;
});
/* наверное здесь должна быть еще одна функция с обработкой текста из текстареа*/
а потом дать доступ к текстареа, помимо "снимаю" и "установка"
webcam.set_hook('onLoad',function(){
// Когда FLASH загружен, разрешаем доступ
// к кнопкам "Снимаю" и "Установка"
shootEnabled = true;
});
|
Визуально так:
1) ![]() 2)CLICK => 3) ![]() 4)Нажимаем сохранить, фото и описание из текстареа улетают в пхп обработчик. |
Rompo,
function sendText() {
var req = new XMLHttpRequest(),
text = document.getElementById('textarea').value;
req.onreadystatechange = function() {
if (req.readyState == 4) {
if(req.status == 200) {
//ловим ответ от сервера
}
}
};
req.open('POST', 'urlTo_file.php', true);
req.send(text);//отправляем текст
}
|
Тогда я добавляю вызов функции в
$('#uploadButton').click(function(){
webcam.upload();
webcam.reset();
sendText(); //СЮДА
togglePane();
return false;
});
и получаю текст с помощью, как я думаю: $text = $_REQUEST['text']; или $text = $_POST['text']; но ни то, ни другое не срабатывает.. в чем моя ошибка? |
Цитата:
|
А можно какой-нибудь пример? я похоже не правильно вас понял.
попробовал запихать функцию в webcam.upload(), но тоже ничего не получилось:
upload: function(url, callback) {
// upload image to server after taking snapshot
// specify fully-qualified URL to server API script
// and callback function (string or function object)
if (callback) this.set_hook('onComplete', callback);
if (url) this.set_api_url(url);
this.get_movie()._upload( this.api_url );
this.sendText(); // вызов вот здесь
},
в описание функции добавил просто этот код:
sendText: function(){
var req = new XMLHttpRequest(),
text = document.getElementById('text_descr').value;
req.onreadystatechange = function() {
if (req.readyState == 4) {
if(req.status == 200) {
alert('!!!');
}
}
};
req.open('POST', 'upload.php', true);
req.send(text);//отправляем текст
},
|
Так тебе вторым запросом отдельно можно передать описание? А как сервер свяжет эти два запроса? Надо какой-то айдишник или что передавать. В любом случае два запроса - это плохо.
this.get_movie()._upload - получается эта функция делает запрос? А где ее код? И может она предоставляет хук для добавления своих данных? |
get_movie: function() {
// get reference to movie object/embed in DOM
if (!this.loaded) return alert("ERROR: Movie is not loaded yet");
var movie = document.getElementById('webcam_movie');
if (!movie) alert("ERROR: Cannot locate movie 'webcam_movie' in DOM");
return movie;
},
Я тоже подумал, что из-за 2х запросов не работает, а одним отправить не знаю как. И еще можешь объяснить, что такое хук? Он функцию вызывает или как? |
Это код функции get_movie. А где код _upload? Вобще странно, get_movie возвращает DOM-элемент, откуда у него возьмется метод _upload ? Муть какая-то....
Цитата:
Цитата:
|
Вот смотри, есть еще такая штука:
// hooks описаны в глобальных переменных
hooks: {
onLoad: null,
onComplete: null,
onError: null
}, // callback hook functions
// а далее 2 функции с постфиксом hook.
// где еще есть хуки и как они описаны, я не нашел
set_hook: function(name, callback) {
// set callback hook
// supported hooks: onLoad, onComplete, onError
if (typeof(this.hooks[name]) == 'undefined')
return alert("Hook type not supported: " + name);
this.hooks[name] = callback;
},
fire_hook: function(name, value) {
// fire hook callback, passing optional value to it
if (this.hooks[name]) {
if (typeof(this.hooks[name]) == 'function') {
// callback is function reference, call directly
this.hooks[name](value);
}
else if (typeof(this.hooks[name]) == 'array') {
// callback is PHP-style object instance method
this.hooks[name][0][this.hooks[name][1]](value);
}
else if (window[this.hooks[name]]) {
// callback is global function name
window[ this.hooks[name] ](value);
}
return true;
}
return false; // no hook defined
},
полный код файла webcam.js :
window.webcam = {
version: '1.0.9',
// globals
ie: !!navigator.userAgent.match(/MSIE/),
protocol: location.protocol.match(/https/i) ? 'https' : 'http',
callback: null, // user callback for completed uploads
swf_url: 'webcam.swf', // URI to webcam.swf movie (defaults to cwd)
shutter_url: 'shutter.mp3', // URI to shutter.mp3 sound
api_url: '', // URL to upload script
loaded: false, // true when webcam movie finishes loading
quality: 90, // JPEG quality (1 - 100)
shutter_sound: true, // shutter sound effect on/off
stealth: false, // stealth mode (do not freeze image upon capture)
hooks: {
onLoad: null,
onComplete: null,
onError: null
}, // callback hook functions
set_hook: function(name, callback) {
// set callback hook
// supported hooks: onLoad, onComplete, onError
if (typeof(this.hooks[name]) == 'undefined')
return alert("Hook type not supported: " + name);
this.hooks[name] = callback;
},
fire_hook: function(name, value) {
// fire hook callback, passing optional value to it
if (this.hooks[name]) {
if (typeof(this.hooks[name]) == 'function') {
// callback is function reference, call directly
this.hooks[name](value);
}
else if (typeof(this.hooks[name]) == 'array') {
// callback is PHP-style object instance method
this.hooks[name][0][this.hooks[name][1]](value);
}
else if (window[this.hooks[name]]) {
// callback is global function name
window[ this.hooks[name] ](value);
}
return true;
}
return false; // no hook defined
},
set_api_url: function(url) {
// set location of upload API script
this.api_url = url;
},
set_swf_url: function(url) {
// set location of SWF movie (defaults to webcam.swf in cwd)
this.swf_url = url;
},
get_html: function(width, height, server_width, server_height) {
// Return HTML for embedding webcam capture movie
// Specify pixel width and height (640x480, 320x240, etc.)
// Server width and height are optional, and default to movie width/height
if (!server_width) server_width = width;
if (!server_height) server_height = height;
var html = '';
var flashvars = 'shutter_enabled=' + (this.shutter_sound ? 1 : 0) +
'&shutter_url=' + escape(this.shutter_url) +
'&width=' + width +
'&height=' + height +
'&server_width=' + server_width +
'&server_height=' + server_height;
if (this.ie) {
html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="webcam_movie" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+this.swf_url+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/></object>';
}
else {
html += '<embed id="webcam_movie" src="'+this.swf_url+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="webcam_movie" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" />';
}
this.loaded = false;
return html;
},
get_movie: function() {
// get reference to movie object/embed in DOM
if (!this.loaded) return alert("ERROR: Movie is not loaded yet");
var movie = document.getElementById('webcam_movie');
if (!movie) alert("ERROR: Cannot locate movie 'webcam_movie' in DOM");
return movie;
},
sendText: function(){
var req = new XMLHttpRequest(),
text = document.getElementById('text_descr').value;
req.onreadystatechange = function() {
if (req.readyState == 4) {
if(req.status == 200) {
alert('!!!');
}
}
};
req.open('POST', 'upload.php', true);
req.send(text);//отправляем текст
},
set_stealth: function(stealth) {
// set or disable stealth mode
this.stealth = stealth;
},
snap: function(url, callback, stealth) {
// take snapshot and send to server
// specify fully-qualified URL to server API script
// and callback function (string or function object)
if (callback) this.set_hook('onComplete', callback);
if (url) this.set_api_url(url);
if (typeof(stealth) != 'undefined') this.set_stealth( stealth );
this.get_movie()._snap( this.api_url, this.quality, this.shutter_sound ? 1 : 0, this.stealth ? 1 : 0 );
},
freeze: function() {
// freeze webcam image (capture but do not upload)
this.get_movie()._snap('', this.quality, this.shutter_sound ? 1 : 0, 0 );
},
upload: function(url, callback) {
// upload image to server after taking snapshot
// specify fully-qualified URL to server API script
// and callback function (string or function object)
if (callback) this.set_hook('onComplete', callback);
if (url) this.set_api_url(url);
this.get_movie()._upload( this.api_url );
this.sendText();
},
reset: function() {
// reset movie after taking snapshot
this.get_movie()._reset();
},
configure: function(panel) {
// open flash configuration panel -- specify tab name:
// "camera", "privacy", "default", "localStorage", "microphone", "settingsManager"
if (!panel) panel = "camera";
this.get_movie()._configure(panel);
},
set_quality: function(new_quality) {
// set the JPEG quality (1 - 100)
// default is 90
this.quality = new_quality;
},
set_shutter_sound: function(enabled, url) {
// enable or disable the shutter sound effect
// defaults to enabled
this.shutter_sound = enabled;
this.shutter_url = url ? url : 'shutter.mp3';
},
flash_notify: function(type, msg) {
// receive notification from flash about event
switch (type) {
case 'flashLoadComplete':
// movie loaded successfully
this.loaded = true;
this.fire_hook('onLoad');
break;
case 'error':
// HTTP POST error most likely
if (!this.fire_hook('onError', msg)) {
alert("JPEGCam Flash Error: " + msg);
}
break;
case 'success':
// upload complete, execute user callback function
// and pass raw API script results to function
this.fire_hook('onComplete', msg.toString());
break;
default:
// catch-all, just in case
alert("jpegcam flash_notify: " + type + ": " + msg);
break;
}
}
};
может сможешь помочь разобраться что к чему? :) |
Тут нет объявления функции _upload
|
в IDE у меня эта функция подсвечивается как "unresolved", где она объявлена я так и не нашел. муть какая-то
Тогда может пойти другим путем: вот есть 2 запроса, как их в один можно объединить и на сервер отправить, или 2 этих запроса обработать? Можно какой-нибудь маленький пример? |
Цитата:
Цитата:
|
| Часовой пояс GMT +3, время: 13:47. |