是否可以制作一个按钮作为文件上传按钮?

Posted

技术标签:

【中文标题】是否可以制作一个按钮作为文件上传按钮?【英文标题】:Is it Possible to make a button as File upload Button? 【发布时间】:2015-10-20 00:16:57 【问题描述】:

我是 php 新手。我有一个表单,我在其上放置了一个按钮 Value as Upload MB,当用户单击此按钮时,它会重定向到我在此处放置文件上传控件和用户上传文件的 Web 表单。 这是图片

点击此按钮后,用户在此表单上重定向

这里用户上传文件。

我的问题

我可以将我的按钮Upload Mb 设为文件上传按钮吗?可以像文件上传控制按钮一样工作吗?

其实我想节省用户时间。我希望当用户单击 Upload MB 按钮时它不会重定向到表单。但是当用户单击Upload MB 按钮时,它允许用户上传文件并打开浏览窗口。之后,当用户上传文件时,它会在表单上重定向。

你们能告诉我这可能吗?

【问题讨论】:

为什么不保留文件上传控件来代替上传MB @GuruprasadRao acyully 我想节省用户时间,我希望用户直接上传文件而无需填写表单 这很令人困惑@sunny!你想节省用户时间,所以你不想重定向!我的建议是用file upload控制替换Upload MB!! @GuruprasadRao 谢谢你的建议。请看下面的 Shrinivas 答案。实际上,我想要答案中的那个功能。在那个功能之后,我想在表单上重定向用户 一旦用户选择了您要重定向的文件?还是一旦上传到服务器? 【参考方案1】:

我的 2 美分主题:全部在代码中,无需向页面添加输入。

function onClickHandler(ev) 
  var el = window._protected_reference = document.createElement("INPUT");
  el.type = "file";
  el.accept = "image/*";
  el.multiple = "multiple"; // remove to have a single file selection
  
  // (cancel will not trigger 'change')
  el.addEventListener('change', function(ev2) 
    // access el.files[] to do something with it (test its length!)
    
    // add first image, if available
    if (el.files.length) 
      document.getElementById('out').src = URL.createObjectURL(el.files[0]);
    


    // test some async handling
    new Promise(function(resolve) 
      setTimeout(function()  console.log(el.files); resolve(); , 1000);
    )
    .then(function() 
      // clear / free reference
      el = window._protected_reference = undefined;
    );

  );

  el.click(); // open
#out 
  width: 100px; height: 100px; object-fit: contain; display: block;


/* hide if it would show the error img */
#out[src=''] 
  opacity: 0;
<img src="" id="out" />
<button onClick="onClickHandler(event)">select an IMAGE</button>

注意:el 可能会在您处理所有数据之前被垃圾收集 - 将其添加到 window.* 将使任何 Promise 处理的引用保持活动状态。

【讨论】:

最干净的【参考方案2】:

引导方式

.choose_file 
    position: relative;
    display: inline-block;   
    font: normal 14px Myriad Pro, Verdana, Geneva, sans-serif;
    color: #7f7f7f;
    margin-top: 2px;
    background: white

.choose_file input[type="file"]
    -webkit-appearance:none; 
    position:absolute;
    top:0;
    left:0;
    opacity:0;
    width: 100%;
    height: 100%;
<div class="choose_file">
    <button type="button" class="btn btn-default" style="width: 125px;">Choose Image</button>
    <input name="img" type="file" accept="image/*" />
</div>

【讨论】:

【参考方案3】:

您可以在代码中保留&lt;input type='file' hidden/&gt;,并在用户点击"Upload MB"按钮时使用javascript点击它。

看看这个fiddle。

这里是sn-p。

document.getElementById('buttonid').addEventListener('click', openDialog);

function openDialog() 
  document.getElementById('fileid').click();
<input id='fileid' type='file' hidden/>
<input id='buttonid' type='button' value='Upload MB' />

这是完整的代码。

<html>
    <head> 
        <script>
            function setup() 
                document.getElementById('buttonid').addEventListener('click', openDialog);
                function openDialog() 
                    document.getElementById('fileid').click();
                
                document.getElementById('fileid').addEventListener('change', submitForm);
                function submitForm() 
                    document.getElementById('formid').submit();
                
            
        </script> 
    </head>
    <body onload="setup()">
        <form id='formid' action="form.php" method="POST" enctype="multipart/form-data"> 
            <input id='fileid' type='file' name='filename' hidden/>
            <input id='buttonid' type='button' value='Upload MB' /> 
            <input type='submit' value='Submit' /> 
        </form> 
    </body> 
</html>

【讨论】:

Shrinivas 上传文件后如何在表单上重定向? 看看这个fiddle。您只需将表单控件包含在 form 标记内。 重定向时是否携带文件? 当然,表单提交在重定向期间会将所有值传输到服务器。在服务器上,可以使用它们的name 属性访问这些值,在这种情况下为'filename' 但是当我在浏览器中运行此代码时,因为我的 php 文件上传按钮不起作用【参考方案4】:

我建议将按钮转换为标签。将 css 应用于标签,使其看起来像按钮。

例如-

        <input type="file" id="BtnBrowseHidden" name="files" style="display: none;" />
        <label for="BtnBrowseHidden" id="LblBrowse">
            Browse
        </label>

【讨论】:

我喜欢这个 :) 从可访问性的角度来看,这不起作用 - 仅使用键盘的用户将无法打开您的文件输入,因为标签无法获得焦点。将标签变成按钮也不起作用:developer.mozilla.org/en-US/docs/Web/HTML/Element/…。不幸的是,否则这是一个非常干净的解决方案。【参考方案5】:
 <html>
 <body>
 <input type="file" id="browse" name="fileupload" style="display: none" onChange="Handlechange();"/>
 <input type="hidden" id="filename" readonly="true"/>
 <input type="button" value="Upload MB" id="fakeBrowse" onclick="HandleBrowseClick();"/>
 </body>
 <script>
 function HandleBrowseClick()
 
   var fileinput = document.getElementById("browse");
   fileinput.click();
 

function Handlechange()

 var fileinput = document.getElementById("browse");
 var textinput = document.getElementById("filename");
 textinput.value = fileinput.value;

</script>
</html>

【讨论】:

上传文件后如何在表单上重定向用户?

以上是关于是否可以制作一个按钮作为文件上传按钮?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 文件上传:是不是可以使用提交按钮触发上传?

Angular 4 - 上传 CSV

element文件上传按钮点击没有弹窗

完成FileUpload的文件上传功能,且可改按钮样式

检查是不是存在上传的文件,显示按钮以查看和下载文件

仅当单击提交按钮时,如何让 Dropzone.js 上传文件?