Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   canvas, сохранение (https://javascript.ru/forum/misc/8266-canvas-sokhranenie.html)

hangover 17.03.2010 14:44

canvas, сохранение
 
на сайте есть страница, на которой с помощью js можно рисовать.
canvas=document.createElement("canvas");
... и тд. Все прекрасно работает.
Задача следующая: сохранять изображения.
в начале сделал так:
Код:

window.open(canvas.toDataURL("image/png"),"mywindow");
все работает, открывать новое окно, в котором изображение и его можно сохранить.
но нужно сохранять изображение на сервере. Пробовал передать base64 изображения гетом, или постом на сервер, но ето не вариант , т.к. если гет - то чаще всего получается сильно большая URL и сервер не хочет ее обрабатывать. Через POST - тоже через раз передает.

потом нашел еще бибилотеку .Теперь вместо нового окна с изображением выскакивает окно с предложением сохранить изображение.
(а самом деле просто изменили заголовок , как я понял.
.replace("image/png", "image/octet-stream"). Но сохраняет файл - без расширения. ( в опере название файла - default, в фф - ****.part где **** - первые 6 символов base4 кодировки )

Подскажите как передрать файл на сервер? ( через форму, через ифрейм, с помощью асинхронного запроса - не важно. ето потом можно настроить, главное чтобы передало и сохранило )

п.с. чего так кажеться вся задача - в передаче правильных заголовков. Но изображение - в base64 - то есть если передать то ето обычная строка. если сделать base64_deconde -> то по идеи и получим изображение. Но ету строку толком и не передать , т.. ее длина может достигать до 300 000 символов. Но браузер понимает етокак изображение. (адресная строка браузра в таком случае data:image/png;base64,iVBORw0KGgoA.....(дальше base64 строка))

еше как вариант
1) (не знаю просто возможно ли это) - перехватывать событие браузера, когда он предлагает сохранить изображение - и послать его на сервер.
2) "скопилить" изображение средствами javascript ( .. = new Image() ) - и предать на сервер. Как ето сделать я не знаю.


Молю вас о помощи, или хотя бы куда копать.

Kolyaj 17.03.2010 14:52

POST'ом все нормально должно передаваться.

hangover 17.03.2010 15:07

POST`ом я передам саму base64 строку , на сервере сделать decode и сохранить? так предлагаете?

1) На пост нету ограничением по длинне передаваемых значений?
2)При передачи постом, почемуто пропадают все символы "+" :)

Kolyaj 17.03.2010 15:14

Цитата:

Сообщение от hangover
POST`ом я передам саму base64 строку , на сервере сделать decode и сохранить? так предлагаете?

Вас что-то смущает?

Цитата:

Сообщение от hangover
1) На пост нету ограничением по длинне передаваемых значений?

Нет.

Цитата:

Сообщение от hangover
2)При передачи постом, почемуто пропадают все символы "+"

Эскейпить надо.

hangover 17.03.2010 15:30

спасибо, все рашилось. я такв начале делал , но что то не получилось и я подумал что не парвильно и начал все усложнять)

вот пхп скрипт котрым сохраняю

$pic = explode(',',$_POST['data']);
$pic = str_replace(' ','+',$pic[1]);
$pic = base64_decode($pic);
$file = fopen('pic.png',w);
fwrite($file,$pic);




Цитата:

Сообщение от Kolyaj (Сообщение 48029)
Эскейпить надо.

вместо этого использовал str_replace.
Скажите пожалуйста, как эскейпить?)


и еше вопрос:
обизательно ли делать encode_URI при асинхронной передачи данных
...
  data: "data=" + options.data || ""
....
xml.open(options.type, options.url , true);
xml.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xml.send(options.data);

Kolyaj 17.03.2010 15:36

Цитата:

Сообщение от hangover
как эскейпить?

encodeURIComponent

subzey 17.03.2010 15:41

По поводу имени файла, попробуйте
.replace("image/png", "image/octet-stream; filename=myimage.png")

hangover 22.03.2010 03:02

Цитата:

Сообщение от subzey
По поводу имени файла, попробуйте
.replace("image/png", "image/octet-stream; filename=myimage.png")

не помогло(
есть еше какиенибудь варианты?


Часовой пояс GMT +3, время: 19:05.