【问题标题】:Java / Spring - zero file length from InputStreamJava / Spring - InputStream 的零文件长度
【发布时间】:2017-02-02 15:58:23
【问题描述】:

我有一个 REST 应用程序,它有一个用 Angular 构建的客户端和一个用 Spring 构建的服务器。我正在尝试发送带有异步请求的文件,但我收到了一个长度为 0 的文件。这很奇怪,因为在标题中我可以读取文件的确切大小(但不是它的名称),但我没有字节流。

这是客户端代码。

$scope.uploadFile = function() {
    var fd = new FormData()
    for (var i in $scope.files) {
        fd.append("uploadedFile", $scope.files[i])
    }
    var xhr = new XMLHttpRequest()
    xhr.upload.addEventListener("progress", uploadProgress, false)
    xhr.addEventListener("load", uploadComplete, false)
    xhr.addEventListener("error", uploadFailed, false)
    xhr.addEventListener("abort", uploadCanceled, false)
    xhr.open("POST", CONST_SERVER_HOST+"/upload/?token="+$scope.token)
    $scope.progressVisible = true
    xhr.send(fd)
}

这是服务器端代码,带有所有@RequestMapping 签名:

@RequestMapping(value = "/upload/", method = RequestMethod.POST, headers = "content-type=multipart/form-data")
public String uploadChunked(
        final HttpServletRequest request,
        final HttpServletResponse response) {
    String res;
    System.out.println(request.getHeader("content-range"));
    System.out.println(request.getHeader("content-length"));
    System.out.println(request.getHeader("content-disposition"));
    System.out.println(request.getHeader("content-type"));
    InputStream lettura = null;
    OutputStream scrittura;
    try
    {
        File targetFile = new File("file.pdf");
        OutputStream outStream = new FileOutputStream(targetFile);
        lettura = request.getInputStream();
        byte[] buffer = new byte[1024];
        int len;
        int total = 0;
        while ((len = lettura.read(buffer)) != -1) {
            total += 1024;
            System.out.println("content" + len);
            outStream.write(buffer, 0, len);
        }
        lettura.close();
        outStream.close();
        res = total+" Bytes";
    }
    catch (IOException e)
    {
        e.printStackTrace();
        res = "exception";
    }
    System.out.println("Ret: "+res);
    return res;
}

最后,这是我在服务器端得到的打印:

null //content-range
15021 //content-length - perfect!
null //content-disposition
multipart/form-data; boundary=----WebKitFormBoundary3F1AuFnuZQqJTRK8 //content-type
Ret: 0 Bytes // :(

这段代码我哪里错了?

提前致谢!

【问题讨论】:

    标签: java angularjs spring file filesize


    【解决方案1】:

    @RequestParam("uploadedFile") MultipartFile file 添加到您的控制器参数中。然后你可以访问字节

    byte[] bytes = file.getBytes();
    

    阅读更多herehere

    【讨论】:

      【解决方案2】:

      仅供参考,这是对我有用的代码,通过多个文件处理进行了改进:

      @RequestMapping(value = "/upload/", method = RequestMethod.POST, headers = "content-type=multipart/form-data")
      public String uploadChunked(final HttpServletRequest request)
      {
      
          String res;
          MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
          try
          {
              InputStream lettura;
              Iterator<String> iterator = multipartRequest.getFileNames();
              int totalBytes = 0;
              while (iterator.hasNext())
              {
                  System.out.println("");
                  String key = iterator.next();
      
                  String filename = multipartRequest.getFile(key).getOriginalFilename();
                  System.out.println("Name: "+filename);
                  System.out.println("Size: "+multipartRequest.getFile(key).getSize());
                  System.out.println("File name: "+multipartRequest.getFile(key).getName());
                  lettura = multipartRequest.getFile(key).getInputStream();
      
                  File targetFile = new File("uploads/"+filename);
                  OutputStream outStream = new FileOutputStream(targetFile);
                  byte[] buffer = new byte[1024];
                  int len;
                  while ((len = lettura.read(buffer)) != -1) {
                      totalBytes += len;
                      outStream.write(buffer, 0, len);
                  }
                  lettura.close();
                  outStream.close();
              }
              res = "Received "+totalBytes+" bytes";
          }
          catch (IOException e)
          {
              e.printStackTrace();
              res = "exception";
          }
          return res;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 2014-09-22
        • 2012-01-11
        • 1970-01-01
        • 2016-06-19
        相关资源
        最近更新 更多