2

複数のファイルをディスクにアップロードする際に問題があります。これが私のコードです。

アップロード機能に送信される 2 つの写真を含むリクエストがあります。2枚の写真はvarと呼ばれる$multiUpload

$folderPath = '/var/www/';
if (is_array($multiUpload)){
            $file = array();
            $filename = array();

            foreach($multiUpload as $key=>$val){
                // get the file extension
                $file[] = explode('.',$val);

                // create custom file name
                $filename[] = time().'.'.$file[$key][1];

                //send to the upload function
                $this->uploadToDisk($folderPath, $filename[$key]);

                // sleep 1 sec so that the pic names will be different
                sleep(1);
            }
                 return $filename;

        }


public function uploadToDisk($folderPath, $filename)
{

    $adapter = new Zend_File_Transfer_Adapter_Http();
    $adapter->setDestination($folderPath);
    $adapter->addFilter( 'Rename',array(
            'target' => $folderPath."/".$filename,
            'overwrite' => true
            ) );
    if ($adapter->receive()) {
        $message = "success";
    } else {
        $message = "fail";
    }

    return $message;
}

これは戻ります

Array
(
    [0] => Array
        (
            [0] => 1332977938.jpg
            [1] => 1332977939.jpg
        )

)

array[0][0] or 1332977938.jpgしかし、実際にディスクに保存されるのはだけです。

なぜ彼らは両方とも救われたのですか?有線

何か案は?

4

1 に答える 1

3

ファイルごとに 1 回しか呼び出すことができないため、2 回目の呼び出しuploadToDiskが返されていると思われます。を呼び出すときにファイルを指定していないため、最初に呼び出したときにすべてのファイルを受け取り、その後エラーで失敗しています。failZend_File_Transfer_Adapter_Http::receive()receiveuploadToDiskFile Upload Attack

ここにあなたが試すことができるいくつかのコードがあります。これは、各ファイルを個別に受信し、 を呼び出すたびに 1 つずつ保存しようとしますuploadToDisk

コードに関するいくつかの注意事項:

  • uploadToDisk元の値がわからないため、($val)の最初のパラメーターを変更する必要があるかもしれません。Zend_File_Transfer_Adapter_Http::getFileInfo()ファイルのリストについては、ファイルのアップロード ( を参照) に使用されるエレメント名の 1 つに対応している必要があります。
  • 一意のファイル名を生成する方法を変更したので、その必要はありませんsleep(1)
  • Zend_File_Transfer_Adapter_Abstract::setDestination()は非推奨であり、将来的には廃止されます。代わりに、Renameフィルターを使用してください。使用時RenamesetDestination()効果なし。

そしてここにある...

<?php

$folderPath = '/var/www/';

if (is_array($multiUpload)){
    $filenames = array();

    foreach($multiUpload as $key => $val){
        // get the file extension
        $ext = explode('.', $val);
        $ext = $ext[sizeof($ext) - 1];

        // create custom file name
        do {
            $filename = uniqid(time()) . '.' . $ext;
            $diskPath = $folderPath . $filename;
        } while (file_exists($diskPath));

        $filenames[$key] = $filename;

        //send to the upload function
        // $val is the file to receive, $diskPath is where it will be moved to
        $this->uploadToDisk($val, $diskPath);
    }

    return $filename;
}


public function uploadToDisk($file, $filename)
{
    // create the transfer adapter
    // note that setDestination is deprecated, instead use the Rename filter
    $adapter = new Zend_File_Transfer_Adapter_Http();
    $adapter->addFilter('Rename', array(
            'target'    => $filename,
            'overwrite' => true
    ));

    // try to receive one file
    if ($adapter->receive($file)) {
        $message = "success";
    } else {
        $message = "fail";
    }

    return $message;
}
于 2012-03-29T00:39:13.397 に答える