Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > XMLHttpRequest + perl


Автор: Paul56 14.7.2009, 16:16
Господа помогите пожалуйста разобраться в ошибке.
Смысл нижеприведённого кода загрузка картинки через XMLHttpRequest
file: func.js
Код

function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}


function upload(u, a) {

var xmlhttp = getXmlHttp()
alert ("upload.cgi?file="+u)
  xmlhttp.open("POST", "upload.cgi?file="+u, true);
  xmlhttp.setRequestHeader("Content-Type", "multipart/form-data");
  
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4) {

alert (xmlhttp.responseText);

  }
};
xmlhttp.send(null);
}


file: upload.cgi
Код

#!C:/perl/bin/perl
use strict;
use warnings;

use CGI;
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
use Image::Size;
use Image::Magick;
my $image = Image::Magick->new;
print "Content-type: text/html\n\n";
my  $file=1;
    $file = param('picture');
if ($file) {
my $in = $file;
    $in =~ m#([^\\/:]+)$#;
my $width=120;    
open (IMAGE, ">i/$file") or die print $!;
binmode(IMAGE);
while (<$in>) {
print IMAGE $_;
}
close(IMAGE);
$image->Read("i/$file");
my ($w0, $h0) = $image->Get('width', 'height');
$w0 = $w0/120;
$h0 = int($h0/$w0);
$image->Scale(width=>$width, height=>$h0); 
$image->Write("i/$file");

print "<img src=\"i/$file\" width=$width height=$h0 alt=\"\">\n";
}
else {
 print "not good: $file\n";   
}



html 
Код

<html><head><title>file upload</title>
 <script type="text/javascript" src="js/func.js"></script>

</head>  
<body>  
<form method='POST' enctype='multipart/form-data' action="upload.cgi">  
<input type='file' name='picture' onChange='upload(this.form.picture, "topicture")'>

<div id=topicture></div>
</form>  
</body> 

последний через alert выдаёт ошибку

<h1>Software error:</h1>
<pre>Malformed multipart POST: data truncated
</pre>
<p>
....

подскажите где ошибся?

Автор: gcc 14.7.2009, 21:24
проблема в аяксе или в скрипте который записывает?

Автор: Paul56 14.7.2009, 21:27
в аяксе, я односзанчно как то не правильно передаю данные без аякса картинки пишутся на диск

Автор: KSURi 14.7.2009, 22:26
Загрузить файл непосредтвенно через ajax нельзя. Для имитации обычно используют или невидимый iframe, или flash.

Автор: Paul56 14.7.2009, 22:31
Могу я у Вас попросить ссылку на пример... ?

Автор: thefree 15.7.2009, 07:59
http://www.sibsoft.net/xupload.html
http://www.ajaxf1.com/download.html?dl=12
а вот тут, проста идеально то что Вам надо
http://sourceforge.net/projects/perlphpuploader/

Автор: KSURi 15.7.2009, 08:26
thefree, посмотрел вещи, которые вы порекомендовали. Асинхронная загрузка сделана только в одном месте, и то, через открытие нового окна (!). Все остальное - просто прогресс-бары.
Paul56, гуглите "загрузка файлов через ajax", на память я примеров с исходниками не помню. Из рабочих примеров, легко: вконтакте, гугл мейл (у обоих flash).

Автор: thefree 15.7.2009, 12:00
KSURi, ну посмотрите лучше ... http://sourceforge.net/projects/perlphpuploader/, тут же все наглядно показано ...
Все как просили, загружает он картинку ... потом проверяет её статус по ajax, если загрузилась то выводит ей по ajax ...
хочет может json прикрутить ... для красоты.

все одно ему POST необходима передавать в iframe, что бы не осуществлялся переход на другую страницу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)