#php #android #codeigniter #unzip #ziparchive
#php #Android #codeigniter #распакуйте #архивировать
Вопрос:
Я создаю zip из серверной части с использованием PHP. и я хочу разархивировать на стороне Android.
Моя структура папок Zip включает
- Папка 1
- файл
- файл
- Папка 2
- файл
- файл
- Файл
Для создания zip я использую следующий код
foreach ($files as $name => $file)
{
// echo $file.' -- ';
if (!$file->isDir())
{
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) 1);
//echo dirname($file);
$zip->addFile($filePath, $relativePath);
}
}
В Android я использую следующий код для распаковки
InputStream is;
ZipInputStream zis;
try {
String filename;
is = new FileInputStream(zipFile);
zis = new ZipInputStream(new BufferedInputStream(is));
ZipEntry ze;
byte[] buffer = new byte[8192];
int count;
while ((ze = zis.getNextEntry()) != null) {
filename = ze.getName();
// it will show
// it will generate an Exception...
if (ze.isDirectory()) {
File fmd = new File(location filename);
fmd.mkdirs();
continue;
}
FileOutputStream fout = new FileOutputStream(location filename);
while ((count = zis.read(buffer)) != -1) {
fout.write(buffer, 0, count);
}
fout.close();
zis.closeEntry();
}
zis.close();
} catch (IOException e) {
e.printStackTrace();
}
Но это не дает мне правильного вывода, который мне нужен.
Я ожидаю вывода в
ze.getName() является FolderName/
но я фактический результат
FolderName/filename
таким образом, он не учитывает косую черту в качестве каталога и выдает исключение File Not Found.
Комментарии:
1.
if (!$file->isDir())
в сочетании с$file->getRealPath();
приведет к полному пути к файлу, а не к каталогу2. используйте
$file->getPath()
вместо этого, чтобы получить путь без имени файла3. @Talal Это не работает с
$file->getPath()
4. ZipArchive не принимает добавление папок только файлов или создание пустой папки. я комментирую только на стороне php, если вы добавите файл, скажем,
$zip->addFile($filePath, $relativePath);
где$relativePath
находитсяsomedir/anotherdir/somefile.txt
,somedir/anotherdir/
он будет создан автоматически5. Ваш комментарий для PHP-стороны работает хорошо, что я уже сделал с помощью
$zip->addFile($filePath, $relativePath);
, но на стороне Android я получил ZipEntry напрямую, какsomedir/somefile.txt
в виде файла, поэтому сначала он не создаст каталог, он напрямую найдет файл внутри каталога. Поэтому со стороны PHP может быть возможно, что он всегда будет добавлять файл вместо каталога.