【问题标题】:Basic multiple file upload not working on mobile基本的多文件上传在移动设备上不起作用
【发布时间】:2018-04-11 04:17:28
【问题描述】:

我创建了一个非常基本的多文件上传表单示例 (reference),它在台式机上完美运行,但在移动设备上却无法运行,至少在我正在测试的那些上运行。

在移动设备上(小米米4 [Android 版本:6.1] - Google Chrome/Mozilla Firefox):当我点击选择文件时,我看到这个屏幕:

如果我选择 Google 相册并选择多个文件,则只会将第一个文件插入到表单中。 如果我选择图库(本机)应用程序并选择多个文件,我会在表单上得到正确的数字,但是当我点击上传时,我会看到“Aw Snap”屏幕:

知道为什么会这样吗?

除了 Google 相册和原生应用外,我还尝试了 5 个不同的应用,最后一个 Piktures 确实有效!

请告诉我这不是应用程序...有没有办法正确获取文件?

附上代码:

<form method="post" enctype="multipart/form-data">
        <input type="file" name="my_file[]" multiple>
        <input type="submit" value="Upload">
    </form>
    <?php
        if (isset($_FILES['my_file'])) {
            $myFile = $_FILES['my_file'];
            $fileCount = count($myFile["name"]);

            for ($i = 0; $i < $fileCount; $i++) {
                ?>
                    <p>File #<?= $i+1 ?>:</p>
                    <p>
                        Name: <?= $myFile["name"][$i] ?><br>
                        Temporary file: <?= $myFile["tmp_name"][$i] ?><br>
                        Type: <?= $myFile["type"][$i] ?><br>
                        Size: <?= $myFile["size"][$i] ?><br>
                        Error: <?= $myFile["error"][$i] ?><br>
                    </p>
                <?php
            }
        }
    ?>

如果你想测试:http://odedta.com/projects/jqueryfileupload/

谢谢!

【问题讨论】:

  • 作为结果状态,浏览器现在内存不足,它可能有多种可能导致此问题的情况,1.您尝试上传的文件太大,2.您是否正在使用 javascript 操作文件接口?
  • @TouqeerShafi 嘿,1. 每个文件大约 80KB,我一次尝试 2-3 个。 2. 在我制作的应用程序中,我使用的是 DropzoneJS,因为我不知道出了什么问题,所以我创建了这个最简单的示例来消除外部类问题或 JS 问题,这是纯 PHP/HTML,这个错误是仍在发生...我希望也许有一个 JS 解决方案可以弥补这个错误...类似于增加原始 input[type="date"] 功能的日期选择器的 JS 类
  • 安卓和谷歌浏览器是什么版本?你检查过其他移动浏览器还是原生浏览器?
  • 你选择什么文件?(什么格式?尝试使用两个 png/jpeg/txt/mp3/binary 文件)。作为您版本 Chrome 中的声音错误(不正确的检索和处理“Intent.ACTION_SEND_MULTIPLE”)。我读。下一个版本的 Android 已修复!
  • @odedta 我同意:Android 错误或只是报告不足的限制。过去,多个文件上传似乎一直是个问题。对于它的价值,看看this,尤其是“caniuse”链接。如果您还没有,请尝试卸载与问题相关的所有应用程序,重新启动设备,然后重新安装应用程序,以防出现异常状态并需要重新初始化。

标签: javascript php android jquery


【解决方案1】:

试试这个可能对你有帮助 这只是用js上传文件的前端部分

window.onload = function() {
  if (window.File && window.FileList && window.FileReader) {
    var filesInput = document.getElementById("uploadImage");
    filesInput.addEventListener("change", function(event) {
      var files = event.target.files;
      var output = document.getElementById("result");
      for (var i = 0; i < files.length; i++) {
        var file = files[i];
        if (!file.type.match('image'))
          continue;
        var picReader = new FileReader();
        picReader.addEventListener("load", function(event) {
          var picFile = event.target;
          var div = document.createElement("div");
          div.innerHTML = "<img class='thumbnail' src='" + picFile.result + "'" +
            "title='" + picFile.name + "'/>";
          output.insertBefore(div, null);
        });        
        picReader.readAsDataURL(file);
      }

    });
  }
}
<input type="file" id="uploadImage" name="termek_file" class="file_input" multiple/>
<div id="result" class="uploadPreview">

【讨论】:

  • 完全相同的错误,只是现在需要 2-3 秒才能显示出来。
【解决方案2】:

我不确定移动浏览器是否支持multiple属性我读过一些文章它不支持或不标准,无论如何如果你想发布多张图片;你可以在下面看到完整的代码

第一步;

您应该使用FileReader 以本地方式在浏览器上加载

使用 FileReader 加载多个文件

document.getElementById("filesToUpload").onchange = function () {
    var fileIndex = 0;
    for ( var x= 0; x < input.files.length; x++) {
        //add to list
        var li = document.createElement('li');
        //Filename listing
        li.setAttribute('id','li_'+x);
        li.innerHTML = 'File ' + (x + 1) + ':  ' + input.files[x].name;
        list.append(li);
        //FileReader create and set onload event
        var reader = new FileReader();
        reader.onload = function (data) {
            data.target.result;
        }
        //Read file
        reader.readAsDataURL(input.files[x]);
    }
}

第二步

您可以将图像内容设置为 textarea 作为每个文件的 base64 数据

reader.onload = function (data) {
    //....
    //Split base64 data from DataURL (// "data:image/png;base64,.....)
    var b64 = data.target.result.split(',')[1];
    var b64Input = document.createElement('textarea');
    b64Input.setAttribute('name','file64[]');
    b64Input.value = b64;
    //...
}

第三步

然后您可以将整个数据发送到您的 php 文件并将您的内容保存为图像

for($i = 0; $i<count($_POST["fileName"]);$i++){
    echo $_POST["fileName"][$i]."<br>";
    //decode base64 content and put file
    file_put_contents($_POST["fileName"][$i], base64_decode($_POST["file64"][$i]));
}

完整代码

HTML 和 JavaScript

<input name="filesToUpload[]" id="filesToUpload" type="file" multiple />
<form method="post" action="multipleFileUpload.php" enctype="multipart/form-data" id="formMultipleFileUpload">
<ul id="fileList">

</ul>
<input type="submit" value="Upload" id="btnUpload">
</form>
<script type="text/javascript">
var input = document.getElementById('filesToUpload');
var list = document.getElementById('fileList');
document.getElementById("filesToUpload").onchange = function () {
    var fileIndex = 0;
    for ( var x= 0; x < input.files.length; x++) {
        //add to list
        var li = document.createElement('li');
        li.setAttribute('id','li_'+x);
        li.innerHTML = 'File ' + (x + 1) + ':  ' + input.files[x].name;
        list.append(li);
        var reader = new FileReader();
        reader.onload = function (data) {
            var li = document.getElementById('li_'+fileIndex);
            var previewImg = document.createElement('img');
            previewImg.setAttribute('width','50');
            previewImg.setAttribute('height','50');
            li.append(previewImg);
            previewImg.src = data.target.result;
            var b64 = data.target.result.split(',')[1];
            var b64Input = document.createElement('textarea');
            b64Input.setAttribute('name','file64[]');
            b64Input.value = b64;
            li.append(b64Input);
            var fileName = document.createElement('input');
            fileName.setAttribute('name','fileName[]');
            fileName.value = input.files[fileIndex].name;
            li.append(fileName);
            fileIndex++;
        }
        reader.readAsDataURL(input.files[x]);
    }
}

PHP (multipleFileUpload.php)

<?php
for($i = 0; $i<count($_POST["fileName"]);$i++){
    echo $_POST["fileName"][$i]."<br>";
    file_put_contents($_POST["fileName"][$i], base64_decode($_POST["file64"][$i]));
}
?>

工作截图

【讨论】:

  • 我把你的解决方案放在这里:odedta.com/projects/jqueryfileupload/ferhat - 我仍然得到同样的错误,但有一个改进,现在,我可以选择 3 个文件并且浏览器识别出 3 个从未发生过的文件大多数插件都在那里。
  • 嗨@odedta 我认为你的服务器有问题,因为它应该看起来像这样https://jsfiddle.net/87c1put3/ 你也可以看到我上传的文件。
  • @odedta 我已经在我的手机上添加了截图,通过 jsfidle 示例和文件上传到你的服务器进行测试。
  • imgur.com/a/qEi5G - 我猜有些设备支持它,有些不支持。您使用哪个应用上传文件?
  • 你的图片尺寸是多少?如果它不大,则意味着它取决于设备,我的设备是 note 5,chrome,我已经测试了另一台设备,即 LG G3 和 chrome,但绘制图片和完成上传需要花费大量时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 2022-01-12
  • 2014-04-22
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
相关资源
最近更新 更多