【问题标题】:Opencart - Upload Specific File TypeOpencart - 上传特定文件类型
【发布时间】:2014-05-15 23:47:54
【问题描述】:

我正在使用 OpenCart 1.5.6,并且有两个选项供客户将文件上传到产品(图像和视频)。当用户点击上传时,我希望他们在浏览文件时只能从他们的计算机中选择特定的文件类型。因此,而不是浏览器窗口中的“所有文件”,我希望它只允许 .png、.jpg、.jpeg、.pdf 等用于图像上传和视频文件,我只希望它查找 .mp4 , .mov, .flv.

这里是一个例子:http://jsfiddle.net/VCdvA/

我尝试使用接受属性according to this post,但它不起作用。

这是我的 product.tpl 代码:

  <input type="button" accept="video/*,image/*" value="<?php echo $button_upload; ?>" id="button-option-<?php echo $option['product_option_id']; ?>" class="button" >
  <input type="hidden" name="option[<?php echo $option['product_option_id']; ?>]" value="" />

我认为问题在于它是 type="button" 而不是 type="file"。是否有其他方法可以限制 OpenCart 产品页面中的上传文件类型?

【问题讨论】:

    标签: file-upload opencart file-type


    【解决方案1】:

    问题在于使用的 jQuery 插件。 AjaxUpload 似乎被不同的开发人员(完全)接管并重新设计(完全),原始(旧)文档的链接已失效(完全)。

    好吧,在探索了那个 jQuery 插件之后,我发现它是这样工作的:在 ptoduct.tpl 你可以看到:

    <?php foreach ($options as $option) { ?>
    <?php if ($option['type'] == 'file') { ?>
    <script type="text/javascript"><!--
    new AjaxUpload('#button-option-<?php echo $option['product_option_id']; ?>', {
        //...
    });
    //--></script>
    <?php } ?>
    <?php } ?>
    

    这意味着对于文件类型的每个选项,此AjaxUpload 都会被实例化。基本上,它只创建一个包含 FILE 类型的 INPUT 且透明度为 0 的 DIV,该 DIV 在 Upload File 按钮上方呈现。这意味着当用户点击 Upload File 时,他点击的是 FILE 类型的 INPUT(不知道这一点)。现在,查看代码我可以看到无法设置此accept="image/*" 属性,因为不支持此(原始代码):

        _createInput: function(){ 
            var self = this;
    
            var input = document.createElement("input");
            input.setAttribute('type', 'file');
            input.setAttribute('name', this._settings.name);
    
            addStyles(input, {
                // ...
            });
    
            // ...
        },
    

    所以现在如果您想添加对此的支持,您需要将此代码更改为此(文件:catalog/view/javascript/jquery/ajaxupload.js,大约第 350 行):

            var input = document.createElement("input");
            input.setAttribute('type', 'file');
            input.setAttribute('name', this._settings.name);
            if (this._settings.accept) {
                input.setAttribute('accept', this._settings.accept);
            }
    

    并将product.tpl中的插件初始化代码更改为:

    <?php foreach ($options as $option) { ?>
    <?php if ($option['type'] == 'file') { ?>
    <script type="text/javascript"><!--
    new AjaxUpload('#button-option-<?php echo $option['product_option_id']; ?>', {
        <?php if ($option['product_option_id'] == <IMAGE_FILE_OPTION_ID>) { ?>
        accept: 'image/*',
        <?php } else if ($option['product_option_id'] == <VIDEO_FILE_OPTION_ID>) { ?>
        accept: 'video/*',
        <?php } ?>
        //...
    });
    //--></script>
    <?php } ?>
    <?php } ?>
    

    这应该足够了。

    【讨论】:

    • 这听起来不错,还挺有效的。首先,我必须在 from else if 中添加一个 },以免出现意外的 else 错误。我在 else if 语句中遇到了另一个问题。基本上当我将它添加到文件并上传时,它不允许我点击按钮。只有我输入的第一个有效。如果我删除 else if 语句,它们都可以工作(尽管它不限制其中之一,因为代码不存在)。是否有原因导致两个命令无法与 ajax 代码一起使用?
    • 接受:'video/*', 接受:'图像/*';
    • 上传 AR 视频选项有效,但标准上传文件一无效
    • 发现错误 - 不知何故你一定写了accept: 'image/*';而不是accept: 'image/*', - 注意第一个(你的)案例中的分号逗号 应该在那里 - 仅适用于图像选项。解决这个问题,它应该可以工作。我更正了代码中缺少的}...
    猜你喜欢
    • 2015-01-29
    • 2018-06-15
    • 2014-07-16
    • 1970-01-01
    • 2011-11-26
    • 2018-11-19
    • 2020-08-09
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多