通过浏览器中的FileReader读取二进制文件并将其正确发送到服务器

时间:2014-06-08 14:58:31

标签: java javascript angularjs spring-mvc filereader

我正在尝试执行以下操作:

  1. 通过FileReader读取二进制文件。
  2. 将文件发送到服务器。
  3. 在服务器中读取文件。
  4. 主要问题在底部。

    通过FileReader读取二进制文件并发送到服务器:

    我正在使用角度,但我不相信它是相关的,所以除非有人会问我,否则我将删除样板代码,除了调用服务器。由于不推荐使用FileReader readAsBinaryString,我正在使用readAsArrayBuffer:

    $resource(myurl, {}, 
                { 
                    post: {
                         method: 'POST',
                         params: {},
                         isArray: false,
                         headers:{'Content-Type':'application/octet-stream'}}
                 });
    
    var reader = new FileReader();
    reader.onload = function() {
        resource.post({}, reader.result);
    };
    

    当此代码运行时,我在网络选项卡中看到数据似乎正确传递。 post数据包含一个字节数组,例如长度为400字节。

    读取服务器中的文件

    我正在使用此代码读取服务器

    @POST
    @Path(myPath)
    @Consumes({"application/zip"})
    @Produces({MediaType.APPLICATION_JSON})
    public Response myRest(@QueryParam("file-name") String fileName, InputStream file) {
        byte[] buffer = new byte[8192];
        int bytesRead;
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        try {
            while ((bytesRead = file.read(buffer)) != -1) {
                output.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] data = output.toByteArray();
    
        return Response.ok().build();
    }
    

    当我调试时,我看到的结果与我发送的字节数组完全不同。例如,虽然我在浏览器网络中看到一个400字节长的数组,但在服务器中我看到10字节长度的数组。

    1. 我是否在客户端正确阅读文件? readAsArrayBuffer是我应该使用的方法吗?
    2. 任何想法为什么我在服务器上得到不同的结果?我应该使用不同的媒体类型吗?或者我应该发送不同的标题?
    3. 谢谢!

0 个答案:

没有答案