cataphract / php-rar

PECL rar extension

Home Page:http://pecl.php.net/package/rar

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ErrorException: stream_copy_to_stream(): Extraction reported as unfinished but no data read. Please report this, as this is a bug.

lqllife opened this issue · comments

功能

项目基于 laravel v8.73.2,想实现获取一个压缩包内所有的文件,因为压缩包内会有中文文件名的情况出现,所以为了避免解压后的文件名乱码,就对压缩包内每项文件进行编码转换,再将文件保存到本地文件夹中。

环境

D:\Projects\statistics>php -v
PHP 7.4.24 (cli) (built: Sep 21 2021 13:38:14) ( NTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies


D:\Projects\statistics>php --ri rar

rar

RAR support => enabled
RAR EXT version => 4.2.0
UnRAR version => 6.00 beta2 patch1 2020-11-12
UnRAR API version => 8 extension 1

代码

/**
* 解压.rar的压缩包
* @param  string  $rarFile      rar压缩包文件路径
* @param  string  $extractPath  解压路径
* @return bool
* @throws ErrorException
*/
protected function unzipRar(string $rarFile, string $extractPath): bool
{
  $rar = RarArchive::open($rarFile);
  if (!$rar) {
      throw new ErrorException('压缩包文件解析失败');
  }
  foreach ($rar->getEntries() as $entry) {
      // 防止中文乱码
      $fileName = $this->convertEncode2Utf8($entry->getName());
      $floders = explode('\\', $fileName);
      $name = count($floders) > 1 ? array_pop($floders) : array_shift($floders);
      // 如果是目录
      if ($entry->getCrc() === 0 || str_contains($name, '\\')) {
          continue;
      }
      $dir = $extractPath . '/' . $name;
      Storage::disk('local')->put($dir, $entry->getStream());
  }
  $rar->close();
  
  return true;
}

具体报错内容

ErrorException: stream_copy_to_stream(): Extraction reported as unfinished but no data read. Please report this, as this is a bug. in file D:\Projects\statistics\vendor\league\flysystem\src\Adapter\Local.php on line 159

#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError()
#1 D:\Projects\statistics\vendor\league\flysystem\src\Adapter\Local.php(159): stream_copy_to_stream()
#2 D:\Projects\statistics\vendor\league\flysystem\src\Filesystem.php(123): League\Flysystem\Adapter\Local->writeStream()
#3 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Filesystem\FilesystemAdapter.php(248): League\Flysystem\Filesystem->putStream()
#4 D:\Projects\statistics\app\Service\BaseService.php(182): Illuminate\Filesystem\FilesystemAdapter->put()
#5 D:\Projects\statistics\app\Service\BaseService.php(95): App\Service\BaseService->unzipRar()
#6 D:\Projects\statistics\app\Http\Controllers\Link\MaterialController.php(84): App\Service\BaseService->unzipFile()
#7 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Controller.php(54): App\Http\Controllers\Link\MaterialController->uploadZip()
#8 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction()
#9 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Route.php(262): Illuminate\Routing\ControllerDispatcher->dispatch()
#10 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Route.php(205): Illuminate\Routing\Route->runController()
#11 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Router.php(695): Illuminate\Routing\Route->run()
#12 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(128): Illuminate\Routing\Router->Illuminate\Routing\{closure}()
#13 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Middleware\SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Routing\Middleware\SubstituteBindings->handle()
#15 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Middleware\ThrottleRequests.php(127): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#16 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Middleware\ThrottleRequests.php(103): Illuminate\Routing\Middleware\ThrottleRequests->handleRequest()
#17 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Middleware\ThrottleRequests.php(55): Illuminate\Routing\Middleware\ThrottleRequests->handleRequestUsingNamedLimiter()
#18 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Routing\Middleware\ThrottleRequests->handle()
#19 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Router.php(697): Illuminate\Pipeline\Pipeline->then()
#21 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Router.php(672): Illuminate\Routing\Router->runRouteWithinStack()
#22 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Router.php(636): Illuminate\Routing\Router->runRoute()
#23 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Routing\Router.php(625): Illuminate\Routing\Router->dispatchToRoute()
#24 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(167): Illuminate\Routing\Router->dispatch()
#25 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(128): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#26 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#27 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#28 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#29 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#30 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#31 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#32 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#33 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#34 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#35 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#36 D:\Projects\statistics\vendor\fruitcake\laravel-cors\src\HandleCors.php(52): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#37 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Fruitcake\Cors\HandleCors->handle()
#38 D:\Projects\statistics\vendor\fideloper\proxy\src\TrustProxies.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#39 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Fideloper\Proxy\TrustProxies->handle()
#40 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#41 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(142): Illuminate\Pipeline\Pipeline->then()
#42 D:\Projects\statistics\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(111): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#43 D:\Projects\statistics\public\index.php(52): Illuminate\Foundation\Http\Kernel->handle()
#44 D:\Projects\statistics\server.php(21): require_once('D:\\Projects\\php...')
#45 {main}

Hello, thanks for your report. Is it possible for you to share the rar file that produced this error?

Hello, thanks for your report. Is it possible for you to share the rar file that produced this error?

感谢您的回复,我用的压缩包就是用 winrar生成的普通rar压缩包。

sample.zip

上面的zip压缩文件包中,包含两个rar文件,两个文件除了文件名不一样外,其他都一模一样。

如果rar文件名是中文,在使用 RarArchive::open($rarFile);时,就会提示:
ErrorException: RarArchive::open(): Failed to open D:\Projects\storage\app\links\abc\20211208112645~~~~~~~~~~~~~背景图.rar: ERAR_EOPEN (file open error) in file D:\Projects\app\Service\Utils\UnZip\FileType\Rar.php on line 22
但如果文件名是不包含中文,则能顺利打开。

打开压缩包,解压到本地后,就会出现ErrorException: stream_copy_to_stream():的报错。

希望尽快得到您的答复。

请问这个问题解决了吗?怎么解决的?我遇到了同样的问题

请问这个问题解决了吗?怎么解决的?我遇到了同样的问题

#17

不客气

不客气

不好意思,上面的是自动回复,你贴出来的说的是PHP8下载rar扩展失败,和这个有什么关系吗?还是说升级到PHP8能解决这个问题?