【问题标题】:Uploading zip file to PHP upload site doesn't work, but works for mac将 zip 文件上传到 PHP 上传站点不起作用,但适用于 mac
【发布时间】:2013-12-13 15:49:16
【问题描述】:

我有两个完全相同的文件。 Test.zip,两者大小相同。该文件是在我的 Mac 上创建的,可以很好地与我的上传脚本一起使用。我在我的 Windows 机器上制作了第二个 Test.zip 并尝试上传,没有。

这是为什么?

所有文件类型都在索引和上传中正确列出,并且没有文件大小。我可以从我的 Mac 上传 zip 文件,而不是我的 XP 机器。我可以从 windows 上传除 rar/zip 以外的所有其他格式。

index.html 类型

   acceptedTypes = {
      'image/png': true,
      'image/jpeg': true,
      'image/gif': true,
      'application/x-rar-compressed': true,
      'application/zip': true,
      'application/octet-stream': true
    },

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <style>
        .hidden {
            display: none;
            }
        #holder {
            margin-bottom: 20px;
            border: 10px dashed #ccc;
            min-height: 300px;
            width: 300px;
            }
        #holder.hover {
            border-color: #0c0;
            }
    </style>
</head>
<body>

    <div id="holder"></div>
    <p id="upload" class="hidden"><label>Drag &amp; drop not supported, but you can still upload via this input field:<br><input type="file"></label></p>
    <p id="filereader">File API &amp; FileReader API not supported</p>
    <p id="formdata">XHR2's FormData is not supported</p>
    <p id="progress">XHR2's upload progress isn't supported</p>
    <p>Upload progress: <progress id="uploadprogress" min="0" max="100" value="0">0</progress></p>

<script>
var holder = document.getElementById('holder'),
    tests = {
      filereader: typeof FileReader != 'undefined',
      dnd: 'draggable' in document.createElement('span'),
      formdata: !!window.FormData,
      progress: "upload" in new XMLHttpRequest
    }, 
    support = {
      filereader: document.getElementById('filereader'),
      formdata: document.getElementById('formdata'),
      progress: document.getElementById('progress')
    },
    acceptedTypes = {
      'image/png': true,
      'image/jpeg': true,
      'image/gif': true,
      'application/x-rar-compressed': true,
      'application/zip': true,
      'application/octet-stream': true
    },
    progress = document.getElementById('uploadprogress'),
    fileupload = document.getElementById('upload');

"filereader formdata progress".split(' ').forEach(function (api) {
  if (tests[api] === false) {
    support[api].className = 'fail';
  } else {
    // FFS. I could have done el.hidden = true, but IE doesn't support
    // hidden, so I tried to create a polyfill that would extend the
    // Element.prototype, but then IE10 doesn't even give me access
    // to the Element object. Brilliant.
    support[api].className = 'hidden';
  }
});

function previewfile(file) {
  if (tests.filereader === true && acceptedTypes[file.type] === true) {
    var reader = new FileReader();
    reader.onload = function (event) {
      var image = new Image();
      image.src = event.target.result;
      image.width = 250; // a fake resize
      holder.appendChild(image);
    };

    reader.readAsDataURL(file);
  }  else {
    holder.innerHTML += '<p>Uploaded ' + file.name + ' ' + (file.size ? (file.size/1024|0) + 'K' : '');
    console.log(file);
  }
}

function readfiles(files) {
    debugger;
    var formData = tests.formdata ? new FormData() : null;
    for (var i = 0; i < files.length; i++) {
      if (tests.formdata) formData.append('file', files[i]);
      previewfile(files[i]);
    }

    // now post a new XHR request
    if (tests.formdata) {
      var xhr = new XMLHttpRequest();
      xhr.open('POST', 'upload.php');
      xhr.onload = function() {
        progress.value = progress.innerHTML = 100;
      };

      if (tests.progress) {
        xhr.upload.onprogress = function (event) {
          if (event.lengthComputable) {
            var complete = (event.loaded / event.total * 100 | 0);
            progress.value = progress.innerHTML = complete;
          }
        }
      }

      xhr.send(formData);
    }
}

if (tests.dnd) { 
  holder.ondragover = function () { this.className = 'hover'; return false; };
  holder.ondragend = function () { this.className = ''; return false; };
  holder.ondrop = function (e) {
    this.className = '';
    e.preventDefault();
    readfiles(e.dataTransfer.files);
  }
} else {
  fileupload.className = 'hidden';
  fileupload.querySelector('input').onchange = function () {
    readfiles(this.files);
  };
}

</script>


</body>
</html>

上传.php

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png", "rar", "zip");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "application/x-rar-compressed")
|| ($_FILES["file"]["type"] == "application/octet-stream")
|| ($_FILES["file"]["type"] == "application/zip")
|| ($_FILES["file"]["type"] == "image/png"))

&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?> 

【问题讨论】:

  • 文件大小是多少?您是否尝试上传非常小的文件?
  • 什么都试过了。没有什么比上传 3mb 更重要的了。它有一个文件限制,我将其提高到 200000000 或一些荒谬的东西,大约 200mb,在任何一个平台上上传的都没有超过 5mb。因为我一直在使用八位字节流,所以我会尝试应用程序/八位字节,但这很奇怪,因为 Windows XP 上传的其他文件,而不是压缩文件。

标签: php html upload


【解决方案1】:

上传 Windows 压缩 ZIP 时$_FILES["file"]["type"] 的值是多少?可能是 mimetype 问题。微软倾向于使用application/octet,而其他理智的世界都使用application/octet-stream

一般来说,最好将发布的变量转储以调试这样的事情。建议将其放在您的 upload.php 顶部附近,以查看实际传递的内容:

echo '<pre>';
print_r($_FILES);
echo '</pre>';

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2015-02-11
  • 2017-08-01
  • 1970-01-01
相关资源
最近更新 更多