【问题标题】:Uploading files using js fileReader results in corrupted files使用js fileReader上传文件会导致文件损坏
【发布时间】:2017-12-04 16:43:19
【问题描述】:

我正在尝试使用 js 文件阅读器和 AJAX 将文件上传到我的服务器。

我使用FileAPIfileReader 读取文件并将其转换为字符串,然后通过AJAX 请求将其发送到服务器。 这是我的客户端 js 代码:

function upload() {
    var file = document.getElementById('periodExcel').files[0];
    if (file) {
        console.log(file);
        var reader = new FileReader();
        reader.readAsText(file, file.type);
        console.log(reader);
        reader.onload = uploadAndRun;
    }
}
function uploadAndRun(event) {
    console.log(event);
    var result = event.target.result;
    $('#js').html(result);
    var fileName = document.getElementById('periodExcel').files[0].name; //Should be 'picture.jpg'

    $.post('./upload.php', {data: result, name: fileName}, function(result2){
        $('#php').html(result2);
    });
}

这里是上传的php脚本:

file_put_contents('upload/' . $_POST['name'], $_POST['data']);

它只是使用 php file_put_contents 函数写入文件。

我的问题是上传的文件已损坏并且与原始文件的大小不同(它更大)。

我尝试使用 php file_get_contents 函数读取相同的文件并使用 file_put_contents 再次写入,结果文件很好,与原始文件相同。

然后我尝试比较两个字符串(来自 file reader 的字符串和来自 file_get_contents 的字符串)并使用 @987654329 比较两个字符串@,这让我知道来自fileReader 的字符串大于来自file_get_contents 的字符串。

那么,我的代码有什么问题,以及在使用readAsText 函数时如何使用 FileReader 以这种方式上传文件。

【问题讨论】:

  • 上传文件时应使用FormData api确保enctype设置正确
  • 我尝试使用它但它没有被填充(追加不起作用),并且发生阻止提交的错误。

标签: javascript php filereader fileapi


【解决方案1】:

您在 PHP 中使用了错误的集合。要访问上传的文件流,请使用$_FILES。 看这里: http://php.net/manual/en/reserved.variables.files.php
在这里:http://php.net/manual/en/features.file-upload.post-method.php

简而言之,PHP 运行时负责从 HTTP 请求读取上传流,将其存储在本地临时文件夹中,并公开上面的地图以供您访问临时文件并可能将其移动到另一个位置(或做任何事情否则你需要处理它)。

【讨论】:

  • 问题是我想使用 AJAX 和 FileReader 来做到这一点。将文件转换为字符串不是错误的方法,它应该可以正常工作。我认为这里的问题是我必须删除结果字符串的某些部分,但我不知道要删除什么。
  • 或者你的意思是虽然我使用这种方法文件应该在 $_file 中而不是在 $_post 中可用?
  • 将文件转换为字符串显然只适用于文本文件,并且需要考虑字符集编码 - 在客户端/浏览器和服务器上必须相同。我个人永远不会走这条路 - 有很多库通过 AJAX 进行“正确”文件上传,因此将文件转换为字符串以上传它们真的是一个 hack。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多