文档章节

magento2图片上传无法创建文件夹和上传图片

a
 alt_tab_jj
发布于 2018/10/16 09:55
字数 612
阅读 43
收藏 0

图片上传报错

后台图片上传或者创建图片储存文件夹时报错:

Directory D:/softe/www/bm.local.com/pub/media/wysiwyg is not under storage root path.

这是由于windows环境下获取"root"路径时没有将 '\'转换成'/'导致的具体报错原因体现在:

D:\softe\www\bm.local.com\vendor\magento\framework\App\Filesystem\DirectoryResolver.php

文件中的validatePath方法的root文件路径没被正确转换

public function validatePath($path, $directoryConfig = DirectoryList::MEDIA)
    {
        $realPath = realpath($path);
        $root = $this->directoryList->getPath($directoryConfig);

        return strpos($realPath, $root) === 0;
    }

修复

方法一(不推荐,手动修改基础核心文件可能会出现错误)

直接修改原文件将root地址也使用realpath()进行转换

public function validatePath($path, $directoryConfig = DirectoryList::MEDIA)
    {
        $realPath = realpath($path);
        $root = realpath($this->directoryList->getPath($directoryConfig));

        return strpos($realPath, $root) === 0;
    }

方法二(推荐)

使用composer安装补丁 命令:

  1. 安装composer-patches
composer require cweagans/composer-patches
  1. 保存补丁文件 补丁/ 13929_2.2.3_directory_resolver_composer_v1.patch
--- /vendor/magento/framework/App/Filesystem/DirectoryResolver.php	2018-02-21 01:25:30.000000000 +0000
+++ /vendor/magento/framework/App/Filesystem/DirectoryResolver.php	2018-06-02 17:04:53.000000000 +0000
@@ -39,7 +39,7 @@
     public function validatePath($path, $directoryConfig = DirectoryList::MEDIA)
     {
         $realPath = realpath($path);
-        $root = $this->directoryList->getPath($directoryConfig);
+        $root = realpath($this->directoryList->getPath($directoryConfig));
         
         return strpos($realPath, $root) === 0;
     }
  1. 修改composer.json
"extra": {
        "magento-force": "override",
        "patches": {
            "magento/framework": {
                "Issue #13929: Images can't be uploaded using WYSIWYG if media directory is a symlink": "./patches/13929_2.2.3_directory_resolver_composer_v1.patch"
            }
        }
    }

4.修补它!

composer install

方法三

重写DirectoryResolver.php

  1. etc/di.xml
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Framework\App\Filesystem\DirectoryResolver"
                type="\ModuleVendor\ModuleName\App\Filesystem\DirectoryResolver"/>
</config>
  1. Override/App/Filesystem/DirectoryResolver.php
<?php
declare(strict_types=1);

/**
 * TODO: temporary override until patch or Magento 2.3 is released.
 * https://github.com/magento/magento2/issues/13929
 */
namespace ModuleVendor\ModuleName\Override\App\Filesystem;

use Magento\Framework\App\Filesystem\DirectoryList;

/**
 * Magento directories resolver.
 */
class DirectoryResolver
{
    /**
     * @var DirectoryList
     */
    private $directoryList;

    /**
     * @param DirectoryList $directoryList
     */
    public function __construct(DirectoryList $directoryList)
    {
        $this->directoryList = $directoryList;
    }

    /**
     * Validate path.
     *
     * Gets real path for directory provided in parameters and compares it with specified root directory.
     * Will return TRUE if real path of provided value contains root directory path and FALSE if not.
     * Throws the \Magento\Framework\Exception\FileSystemException in case when directory path is absent
     * in Directories configuration.
     *
     * @param string $path
     * @param string $directoryConfig
     * @return bool
     * @throws \Magento\Framework\Exception\FileSystemException
     */
    public function validatePath($path, $directoryConfig = DirectoryList::MEDIA)
    {
        $realPath = realpath($path);
        // BEGIN EDIT by @erikhansen
        /**
         * Since media directory is a symlink, need to run both paths through realpath in order for the comparison to
         * work.
         * The proper fix for this should involve a STORE > Configuration setting where an admin can choose whether to
         * allow symlinked directories.
         */
        $root = realpath($this->directoryList->getPath($directoryConfig));
        // END EDIT

        return strpos($realPath, $root) === 0;
    }
}

© 著作权归作者所有

a
粉丝 0
博文 9
码字总数 7232
作品 0
深圳
私信 提问
resin下的上传图片无法访问

上传图片,我会保存为类似的路径/upload/2013/1/15/1358234956682.jpg,没有文件夹就创建文件夹 但是过一段时间,resin下面上传图片就会有问题,404错误。 可是,我打开服务器看,文件夹下面...

心扬
2013/01/15
206
1
jfianl2.2 图片上传问题

private String fileDir = PathKit.getWebRootPath() + "\\upload\\img_house\\";//指定用户文件上传路径 private final int maxSize = 5 * 1024 * 1024; // 5M最大文件限制 public void up......

rylpngy
2016/03/10
215
0
Thinkphp使用jQuery File Upload异步上传图片实例教程(1):上传单张图片

图片上传是很多网站必备的功能之一,异步多图上传也是很多初学者比较头疼的问题。所以今天我们就使用比较热门的Thinkphp和jquery File upload插件完整的开发一个多图异步上传功能。 这篇文章...

星空幻颖
2017/02/12
0
0
yii 图片上传以及图片处理扩展

我新建的表中的头像的字段名是img,用的是gii生成的后台表的model,curd,默认的img是字符串,下面看如何将这个字符串更改为上传图像。 在试图文件中:(备注下面图片的应该是'htmlOptions'=>ar...

菜鸟飞来
2014/04/25
0
0
UEditor 1.36 版本 jsp版上传图片自定义路劲配置

由于项目需要,最近使用了ueditor,并实现了图片以及文件的上传功能。走了不少弯路,花了点时间总结总结,记录一下以防忘记! 1.去官网http://ueditor.baidu.com/website/download.html下载u...

jxlgzwh
2014/01/04
5.8K
2

没有更多内容

加载失败,请刷新页面

加载更多

查看线上日志常用命令

cat 命令(文本输出命令) 通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们要输出当前这个日志的前后几行: 显示file文件里匹配nick那行以及上下5行 cat error.log | grep -C ...

xiaolyuh
16分钟前
3
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
23分钟前
2
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
30分钟前
2
0
flutter 剪切板 复制粘贴

复制粘贴功能 import 'package:flutter/services.dart'; Clipboard.setData(ClipboardData(text:_text));Clipboard.getData;...

zdglf
32分钟前
3
0
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?

面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费...

米兜
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部