问一个感觉就是搞笑的需求

情景:

  1. 后台相关的只有一个上传文件的接口(对方不会再给你写其它接口了!!!),前端上传什么文件它就把这个文件存到服务器。
  2. 前端通过 ajax 发送一个 get 请求把服务器上的一个 data.json文件下载,然后根据这个 json 文件渲染出相关的 dom,如果用户进行了相关操作的话,修改这个data.json文件,然后再把这个 data.json
    文件通过上传文件的接口存回服务器,以供下次请求下载。

我现在面临的问题:

  1. ajax 发送的 get 请求把data.json 下载下来时我现在只知道把这个 json 转成字符串或者Object,不知道怎么以文件的形式保存下来还要读取、操作最后再上传。
  2. 浏览器上传文件应该是只有通过 input:file 标签让用户选中文件后再上传吧。但现在这个需求是明显不可能让用户选择文件再上传的,而这又不符合浏览器的安全策略了(文件不通过用户的选择,而是直接用 js 选中上传)。

对方给的两个思路是(感觉等于没说):

  1. js 生成系统临时文件,加载文件路径到浏览文件的 input,提交文件。
  2. ajax发送 post 请求时直接附上生成的文件内容

在这里求各位大佬给点思路,如果不行的话就给点强力的理由反驳对方。



在这里先谢谢各位大佬提醒的 Blod,要不都不知道还有这么一个接口,以后有时间的话还是要把MDN的api都过一遍的好,不至于一点思路都没有。

随便把实现贴一下,其实了解的话也挺简单的。

function handleUpload(json) {    // json就是一个对象
      let file = new File([new Blob([JSON.stringify(json)])], new Date().getTime() + ".json");
      let fd = new FormData();
      fd.append('file', file);
      axios({
        url: 'URL',
        method: 'post',
        headers: { 'Content-Type': 'application/json' },
        data: fd
      }).then(res => {
        console.log(res);
      }).catch(err => {
        console.error(err);
      });
    }

相关文档: Blob File

阅读 4.7k
9 个回答

其实没有你想象的那么复杂

  1. get到data.json之后,并不用将其内容保存到本地文件,浏览器内js也是做不到这样的事情的,只要保存在ls这样的本地存储内,或是在当前页面内进行修改后上传
  2. 利用formdata+blob对象方式将修改过后的json先转化为blob对象,并指定MIME为json文件。不过这里也是可以使用File对象进行构造,都可以试一下。也不是很清楚你的项目的具体情况。
  3. 然后formdata进行ajax上传。Blob对象基本上约等于file对象,其为二进制格式数据,但是不同的后端代码上可能会有对应的不同接受写法。

你需要的是二进制及文件相关的操作。

关键字:

Buffer,ArrayBuffer, Blob, TypedArray, Int8Array, Int16Array, Int32Array等。

(Hint:当前 Javascript 引擎处理Unicode字符串会有点小坑,一般遇不到。)

这后端把json当数据库了?真厉害,可以尝试转化为二进制数据。

var json = {}
var blob = new Blob([json])

1.存文件是不可能了,但是可以考虑indexeddb或者localStorage
2.使用blob类型

浏览器操作文件几乎是不可能的了 用localstorge转blob上传

在线修改 还说的过去. 比如说购物的收件人信息, 修改提交后 重新渲染dom. 可是尼玛要弄成文件? 不要太牛币啊

客户端的配置文件可以保留在内存或者localstorage里面,上传可以使用XMLHttpRequest对象进行上传

阔以这样。。。。能不能你自己弄一个nodejs的后台呢作为proxy server,你浏览器端先把data.json的内容作为post方法的body穿给你的proxy server,这个proxy server把object转存为一个本地服务器上的文件,在去发送request给你哪个该死的后端同事写的真正的upload service

修改的时候用json对象修改,修改完后,转广西然后转成base64或FormData,后台(上传文件的接口)直接就可以以文件的形式接收。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题