Subject: Re: [LON-CAPA-dev] Suggestion of new author tool: upload of .ZIP files and unzip it in the current work directory in the Construction Space area

From: Ricardo Luis Kulzer <[email-masked]>
Date: Fri, 03 Oct 2003 21:49:11 -0300

I saw a sample of file manager applied to Apache that allows to unzip 
a .ZIP file: it's the OpenIndex (the site is 
http://www.xorgate.com/Apache/OpenIndex/).

To see how it works, open the following URL:
http://www.xorgate.com/Apache/OpenIndex/demo/.XOI
(User=openindex  
Password=02sep02)

I took the sources of OpenIndex from 
http://www.cpan.org/authors/id/S/SA/SANDERSON/OpenIndex-1.05.tar.gz

Inside the distribution, the main code is in a file called OpenIndex.pm. 
and it uses the following function to unzip the files.

------------------------------------------------------------------------
sub Unzip {
 my ($r,$args,$cfg,$root,$src,$dst) = @_;
    $dst=~s:/$::;        # strip any trailing '/'
    use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
    use Archive::Zip::Tree;
 my $lang = new Apache::Language($r) if $cfg->{language};
 my $msg;
 my $cmdname=$lang->{Unzip} || 'Unzip';
    chomp $cmdname;
    unless($dst) {
    $msg=$lang->{DestPath} || 'Bad destination path';
    errmsg("${cmdname}: $msg");
    return 0;
    }
    $src="$root$src";
    $dst="$root$dst";
 my $fgid=(stat $src)[5];
    unless(isagid($args->{gid},$fgid) || $args->{isadmin}) {
    $msg=$lang->{SourceAccess} || 'Source access denied';
    errmsg("${cmdname}: $msg");
    return 0;
    }
    $fgid=(stat $dst)[5];
    if(! -d _) {
    $msg=$lang->{DestDir} || 'Destination is not a directory';
    errmsg("${cmdname}: $msg");
    return 0;
    }
    unless(isagid($args->{gid},$fgid) || $args->{isadmin}) {
    $msg=$lang->{DestAccess} || 'Destination access denied';
    errmsg("${cmdname}: $msg");
    return 0;
    }
 my $zip=Archive::Zip->new($src);
    unless ($zip) {
    $msg=$lang->{FileRead} || 'file read';
    errmsg("${cmdname}: $msg");
    return 0;
    }
 my $files=0;
 my $name;
    $dst.='/';
    for my $member ($zip->members()) {
    ($name=$dst).=$member->fileName();
    if($member->isDirectory()) {
        mkdir $name,0775;
        chown(-1,$fgid,$name);
            next;
    }
    unless($member->extractToFileNamed($name)==AZ_OK) {
        errmsg("$cmdname: $name");
        return 0;
    }
    chown(-1,$fgid,$name);
    ++$files;
    }
    $r->log->notice(__PACKAGE__." $args->{user}: Unzip: $src files=$files");
    1;
}

------------------------------------------------------------------------

I think it's not difficult to implement similar feature in LON-CAPA 
Construction Space area.

I think that the first thing to do it's add the Unzip button in 
the publisher.html  file of the LON-CAPA sources. Am I right?

Ricardo L. Kulzer

Gerd Kortemeyer escreveu:

> Ricardo,
>
> Thank you very much for your input. There is actually a bug report 
> regarding ZIP files, see
>
>  http://bugs.lon-capa.org/show_bug.cgi?id=659
>
> I have changed the milestone on that enhancement request to "1.1" - I 
> had similar experiences trying to teach faculty about having to upload 
> ALL files associated with an HTML file.
>
> If you open an account on Bugzilla, you can put yourself on the 
> cc-list of the above bug to see what happens.
>
> Please let us know if you would like your machine connected to a cluster.
>
> - Gerd.
>
> On Thursday, September 11, 2003, at 09:58  PM, Ricardo Luis Kulzer wrote:
>
>>     Hello.  
>>     I’m a new user of LON-CAPA, and I don’t know many thinks about 
>> its code, but I’m investigating it. now.  
>>     In our laboratory, we used another e-learning software called 
>> TELEDUC (http://teleduc.nied.unicamp.br/teleduc/), very good, but it 
>> doesn't bring all the advantages offered by the LON-CAPA.  
>>     However, an important feature that is missing in LON-CAPA, and it 
>> exists TELEDUC, is a tool that allows to do upload of several files 
>> compacted in one only .ZIP file, and allow to unzip the .ZIP file in 
>> the server later.   
>>     So, when developing a page using some HTML editor like Netscape 
>> Composer, we used compact the file .HTML and << many >> images files 
>> (.GIF, .JPG) in only one .ZIP file. Soon after, through the WEB 
>> interface of TELEDUC, we transfer (upload) the .ZIP file in to the 
>> TELEDUC server. Then, the WEB interface provides a new button that 
>> allows unzip that file in the server and to publish them as a new 
>> Content Page, with the .HTML and images files totally decompressed.
>>     I tried to do the same task in LON-CAPA, but it doesn't present 
>> this resource. So I needed to do upload of file by file, using the 
>> tool Construction Space, and that is a annoying task (upload file by 
>> file…).
>>     I know that I can use SSH file transfer or Samba, but It’s 
>> difficult to teach all this thinks to a Geography teacher, for 
>> example, that usually don’t know and don’t like computer a lot. And 
>> another advantage is that we don’t need to open smb and ssh ports to 
>> every author. He can do all this thinks through http server, in a 
>> much more secure way, using the simple and easy Construction Space 
>> tool of LON-CAPA.
>>     Then I would like to propose to the LON-CAPA development, to 
>> create a new tool in the Construction Space area of LON-CAPA, that 
>> allows to upload a .ZIP file, and automatically unzip it into the 
>> server. Or alternatively, a tool that allows to upload of a whole 
>> paste with many files at the same time (like select many files in 
>> Windows Explorer using Shift key), without the need of currently file 
>> by file upload tool available today in LON-CAPA.  
>>     I saw in the TELEDUC code that the function responsible for unzip 
>> the .ZIP file in the server after the upload is implemented in PHP. 
>> The PHP code is more or less like this:  
>>  
>> / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
>> * * * *  
>>    DescompactarArquivoZip function - Unzip compressed cribs.  
>>    Input: $zip - path and name of the zip cribs  
>>              $destination - destination path to unzip   
>>    Output: true i all ok  
>> * /  
>> function DescompactarArquivoZip ($zip,$destination)  
>> {  
>>   $command = " unzip -q -o \"". $zip ". \ " -d \"". $destination ". 
>> \"";  
>>   system($command,$status);  
>>   CreateIndexFile ($destination);  
>>   SetPermissions($destination);  
>>   return (! $status);  
>> }  
>>  
>>     So, I think it’s not difficult to insert an equivalent function 
>> in LON-CAPA code, not in PHP, but in perl, the main LON-CAPA 
>> language. It would be enough to add a button in the Construction 
>> Space area to allow the upload of .ZIP files. After the upload, the 
>> system of the LON- CAPA will be able to automatically unzip the file 
>> in the current work directory of Construction Space area, or to show 
>> a new option for the .ZIP file that allows unzip it into the server, 
>> to be published later.  
>>     I await suggestions to implement this new tool. And sorry for my 
>> poor English.
>>
>>     Thanks,
>>     Ricardo Luis Kulzer.
>>
>>  
>>  
>>

---

From: Joshua Tacey <[email-masked]>
Date: Sat, 04 Oct 2003 12:00:53 -0400

Hey everyone,

I will be handling the implimentation of the unzip file support into 
lon-capa.  I will be starting it probably late this week (friday), what 
I plan to do is to impliment it as a cgi script that will integrate 
seamlessly into lon-capa, as thats what we have todo for technical 
reasons.  However, it should have all of the features that are needed, 
unzipping into the working directory and unzipping into a new directory.

thanks

josh
[email-masked]