-- create a zip file

declare
  l_file1 blob;
  l_file2 blob;
  l_zip blob;
 
begin

  l_file1 := http_util_pkg.get_blob_from_url ('http://www.oracleimg.com/admin/images/ocom/hp/oralogo_small.gif');
  l_file2 := http_util_pkg.get_blob_from_url ('http://www.oracle.com/ocom/groups/public/@ocom/documents/webcontent/oracle-footer-tagline.gif');
 
  zip_util_pkg.add_file (l_zip, 'some_folder/some_filename.gif', l_file1);
  zip_util_pkg.add_file (l_zip, 'some_other_filename.gif', l_file2);
  zip_util_pkg.finish_zip (l_zip);
  
  zip_util_pkg.save_zip (l_zip, 'DEVTEST_TEMP_DIR', 'my_zip_file.zip');
 
end;


-- unzip files, list file names only

declare
  fl zip_util_pkg.t_file_list;
begin
  fl := zip_util_pkg.get_file_list( 'DEVTEST_TEMP_DIR', 'my_zip_file.zip' );
  if fl.count() > 0
  then
    for i in fl.first .. fl.last
    loop
      dbms_output.put_line( fl( i ) );
    end loop;
  end if;
end;
/

-- unzip files, retrieve file into blob, print info, and save it to disk

declare
  fl zip_util_pkg.t_file_list;
  l_file blob;
begin
  fl := zip_util_pkg.get_file_list( 'DEVTEST_TEMP_DIR', 'my_zip_file.zip' );
  if fl.count() > 0
  then
    for i in fl.first .. fl.last
    loop
      dbms_output.put_line ( fl( i ) );
      l_file := zip_util_pkg.GET_FILE( 'DEVTEST_TEMP_DIR', 'my_zip_file.zip', fl( i ) );
      dbms_output.put_line( ' ' || nvl( dbms_lob.getlength( l_file ), -1 ) );
      file_util_pkg.save_blob_to_file ('DEVTEST_TEMP_DIR', 'unzipped_file_' || fl(i), l_file);
    end loop;
  end if;
end;
/

-- Office 2007 files (.docx, .xlsx, etc) are in fact zip files, with contents stored as xml files
-- we can extract the xml content from the file and query it

-- see also ooxml_util_pkg

begin
  file_util_pkg.save_blob_to_file ('DEVTEST_TEMP_DIR', 'my_word_doc.docx', http_util_pkg.get_blob_from_url ('http://foobar.example/document1.docx'));
end;

select extractvalue( column_value, '*/text()')
from table( xmlsequence( xmltype( zip_util_pkg.get_file( 'DEVTEST_TEMP_DIR', 'my_word_doc.docx', 'word/document.xml' ), nls_charset_id( 'UTF8' )).extract( 'w:document/w:body/w:p/w:r/w:t', 'xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"' )))

