web-dev-qa-db-ja.com

サーバーにZipを抽出し、ファイルをノードにアップロードしますか?

抽出したZipファイルをユーザーがアップロードできるようにし、.jpgファイルが含まれているかどうかを調べます。そのファイルを使用して新しいノードを作成します。アップロードされた.jpgと.Zipファイルの違いは、最初のオブジェクトがオブジェクトとして取得されたのに対し、2番目のオブジェクトをオブジェクトとして取得する方法がわからないことです。

PclZip ライブラリを使用しています。

これは、アップロードしたファイルがJPEGの場合に使用するコードの一部です。

$file = $form_state['values']['file'];

$original_filename = $file->filename;
$original = file_unmanaged_copy($file->uri, 'public://work', FILE_EXISTS_REPLACE);
file_unmanaged_delete($file->uri);
list($file, $tfile) = some_fileprep($original_filename);

これは、ファイルが.Zipファイルの場合に使用するコードです。

include $pclzip_lib.'pclzip.lib.php';
$Zip = new PclZip($file->uri);


for ($i=0; $i<$total_files; $i++) {
    $file_name = $list[$i]['filename'];
    list($f_name,$xt) = explode('.', $file_name);
    $xt=strtolower($xt);

    $regex = '/\.(' . preg_replace('/ +/', '|', preg_quote('png gif jpg jpeg tif tiff html')) . ')$/i';
    if (preg_match($regex, $xt) and ($list[$i]['size'] < 10000000)) {
        $error[] = "File with conflict: ".$file_name;
        if((($xt == 'png') or ($xt == 'gif') or ($xt == 'jpg') or ($xt == 'jpeg') or ($xt == 'tif') or ($xt == 'tiff')) and ($f_name == 'preview')){
            $file->filename = $f_name.".".$xt;
            $file->uri = $f_name.".".$xt;
            echo "Yes: ".$f_name.".".$xt;
            $preview = true;
        }
    }

    if(is_null($error))
    {
            $to_extract = $GLOBALS['_SERVER']['DOCUMENT_ROOT'] . '/' . drupal_get_path('module', 'some') . '/testing/';
            $ar = $Zip->extract(PCLZIP_OPT_PATH, $to_extract);
            $file->filename = $ar->filename;
            $file->uri = $ar->filename;

        }
}
3
Andres Grosso

ファイルを正常に解凍すると、次のコードが得られます。

_if(is_null($error))
{
        $to_extract = $GLOBALS['_SERVER']['DOCUMENT_ROOT'] . '/' . drupal_get_path('module', 'some') . '/testing/';
        $ar = $Zip->extract(PCLZIP_OPT_PATH, $to_extract);
        $file->filename = $ar->filename;
        $file->uri = $ar->filename;
}
_

Zipを抽出すると、$ fileオブジェクトが作成されます。次のようなdrupal APIを使用して保存するだけです。

$original = file_unmanaged_copy($file->uri, 'public://work', FILE_EXISTS_REPLACE);

0
tenken

次のコードのように、単純に file_unmanaged_save_data() を使用できます。ここで、$dataは、.Zipファイルに含まれる.jpegファイルの内容です。

file_unmanaged_save_data($data, 'public://work', FILE_EXISTS_REPLACE);

補足として、Drupalには ArchiverZip クラスが含まれています。これはおそらくPclZipクラスの代わりに使用する必要があります。通常、クラスを直接使用しますが、 pdate_manager_archive_extract() で使用される次のようなコードを使用します。

  $archiver = archiver_get_archiver($file);
  if (!$archiver) {
    throw new Exception(t('Cannot extract %file, not a valid archive.', array('%file' => $file)));
  }

  // Remove the directory if it exists, otherwise it might contain a mixture of
  // old files mixed with the new files (e.g. in cases where files were removed
  // from a later release).
  $files = $archiver->listContents();

  // Unfortunately, we can only use the directory name to determine the project
  // name. Some archivers list the first file as the directory (i.e., MODULE/)
  // and others list an actual file (i.e., MODULE/README.TXT).
  $project = strtok($files[0], '/\\');

  $extract_location = $directory . '/' . $project;
  if (file_exists($extract_location)) {
    file_unmanaged_delete_recursive($extract_location);
  }

  $archiver->extract($directory);

archiver_get_archiver() 使用 drupal_realpath() ;これは、ファイル名がpublic://archive.Zipなどのストリームラッパーを使用している場合に、ファイルの実際のパスを取得できることを意味します。

6
kiamlaluno