如何将输入文件对象序列化为 JSON?

IT技术 javascript json file
2021-01-17 16:37:45

我想将 HTML 输入文件转换为这样的 JSON 字符串:

var jsonString = JSON.stringify(file);
console.log( file );
console.log( jsonString );

现在,在我的 Firebug 中,它记录为:

File { size=360195, type="image/jpeg", name="xyz.jpg", mehr...} 
Object {}

为什么是jsonString空的?

背景信息:我想将带有 JSONP 的文件引用发送到另一个 PHP 服务器。

附加信息:我只想将文件指针(引用)转换为字符串,以便通过 GET 发送。

6个回答

在 Chrome、Firefox 和 Safari 中无法直接将File对象转换为 JSON JSON.stringify

您可以使用变通方法将File对象转换为字符串JSON.stringify

前任:

// get File Object  
var fileObject = getFile();

// reCreate new Object and set File Data into it
var newObject  = {
   'lastModified'     : fileObject.lastModified,
   'lastModifiedDate' : fileObject.lastModifiedDate,
   'name'             : fileObject.name,
   'size'             : fileObject.size,
   'type'             : fileObject.type
};  
 
// then use JSON.stringify on new object
JSON.stringify(newObject);

您还可以将toJSON()行为添加到您的File对象

前任:

// get File Object  
var fileObject = getFile();

// implement toJSON() behavior  
fileObject.toJSON = function() { return {
   'lastModified'     : myFile.lastModified,
   'lastModifiedDate' : myFile.lastModifiedDate,
   'name'             : myFile.name,
   'size'             : myFile.size,
   'type'             : myFile.type 
};}  
 
// then use JSON.stringify on File object
JSON.stringify(fileObject);

注意File使用POSTHTTP 方法对象发送到服务器

@williamle8300 你错过了问题的一部分,说他想将File对象作为 JSON 请求发送到PHP服务器,以便他想对File对象进行字符串化您放置的问题链接,要求另一种情况,接受答案说:(您不能序列化File对象)->(此问题的相同问题)。我的答案是 Stringify FileObject 的解决方法
2021-03-25 16:37:45
呃……什么?File API 并不意味着可以转换为 String。请参阅:stackoverflow.com/questions/19119040/...
2021-03-26 16:37:45
实际上,在 Chrome 中你也不能对File对象进行字符串化
2021-04-02 16:37:45
Stringfying 和 Serializing 是同义词
2021-04-03 16:37:45
是的,现在我JSON.stringifyFilechrome 中的 Object 进行了测试但不起作用。但是当我回答这个问题时我已经测试过了
2021-04-06 16:37:45

您必须使用FileReader API读取文件内容File 对象不包含文件内容(它只是一个指向文件的指针,它允许您稍后阅读)。

您可以查看这篇HTML5Rocks 文章以了解有关此 API 用法的更多信息。

var file = getAFile( );

var success = function ( content ) {
  console.log( JSON.stringify( content ) ); }

var fileReader = new FileReader( );
fileReader.onload = function ( evt ) { success( evt.target.result ) };
fileReader.readAsText( file );
我认为这不是我项目中的解决方案。有一个问题,因为我将使用 GET 发送字符串。如果文件是例如 500 MB,则字符串的大小太长。
2021-03-18 16:37:45
那么,不要使用 GET 发送它?我不确定你想要什么。如果您只需要发布文件,请使用FormData而不是 JSON,因为前者可以简化文件上传,而无需在 RAM 中缓冲其内容。
2021-03-19 16:37:45
您不能通过 GET 发送文件。POST 是这里的方式,我不明白您为什么更喜欢使用 GET。Web 服务器永远不会愿意解析 500Mo 的 URL。
2021-03-30 16:37:45
你读过这篇文章吗?evt.target.result是包含文件内容的字符串。出于安全原因,使用 FileReader API 是获取它的唯一方法。
2021-03-31 16:37:45
谢谢您的回答。我想将指针发送到另一台服务器。所以我必须将文件指针转换为字符串。你有想法吗?
2021-04-04 16:37:45

如果有人仍在寻找解决方案,请在 JSFiddle上的不同帖子和工作示例中查看我的答案

JS:

function getFiles(){
    var files = document.getElementById("myFiles").files;
    var myArray = [];
    var file = {};

    console.log(files); // see the FileList

    // manually create a new file obj for each File in the FileList
    for(var i = 0; i < files.length; i++){

      file = {
          'lastMod'    : files[i].lastModified,
          'lastModDate': files[i].lastModifiedDate,
          'name'       : files[i].name,
          'size'       : files[i].size,
          'type'       : files[i].type,
      } 

      //add the file obj to your array
      myArray.push(file)
    }

    //stringify array
    console.log(JSON.stringify(myArray));
}

HTML:

<input id="myFiles" type="file" multiple onchange="getFiles()" />
我应该如何从后端的这个文件对象中获取文件
2021-04-06 16:37:45

您只需要一个自定义替换器:

function stringify(obj) {
    const replacer = [];
    for (const key in obj) {
        replacer.push(key);
    }
    return JSON.stringify(obj, replacer);
}

const json = stringify(file);
console.log(file);
console.log(json);

现在你应该看到:

File {name: "xyz.jpg", type: "image/jpeg", size...}
'{"name":"xyz.jpg","type":"image/jpeg","size"...}'

我没有循环遍历,或者一个接一个地提取每个键,而是想出了这个函数,并且我已经使用了它的图像输入。

const fileObject = e.target.files[0];

重要通知

//dont use shorthand for of loop
for (const [key, value] in Object.entries(x)) 
it can't loop through a file object in JS 

改用此代码

const imageObject = {};

for (const key in fileObject) {
    const value = fileObject[key];
    const notFunction = typeof value !== "function";
    notFunction && (imageObject[key] = value);
}

console.log(imageObject) // => should give you a normal JS object now