Я подозреваю, что второй вызов uploadToDisk
возвращает fail
, поскольку вы можете вызывать Zend_File_Transfer_Adapter_Http::receive()
только один раз для каждого файла. Поскольку вы не указываете файл при вызове receive
, он получает все файлы при первом вызове uploadToDisk
и впоследствии завершается с ошибкой File Upload Attack
.
Вот код, который вы можете попробовать. Он пытается получить каждый файл по отдельности, а затем сохранять их по одному при каждом вызове на uploadToDisk
.
Несколько замечаний по поводу кода:
- Возможно, необходимо изменить первый параметр на
uploadToDisk
($ val), так как я не уверен, каковы исходные значения. Он должен соответствовать одному из имен элементов, используемых для загрузки файла (см. Zend_File_Transfer_Adapter_Http::getFileInfo()
) для списка файлов.
- Я изменил метод генерации уникального имени файла, чтобы вам не нужно было
sleep(1)
Zend_File_Transfer_Adapter_Abstract::setDestination()
устарела и исчезнет в будущем. Вместо этого просто используйте фильтр Rename
. При использовании Rename
, setDestination()
не имеет эффекта.
И вот оно ...
<?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;
}