【问题标题】:Flow.js and Java Servlet upload file 0 bytesFlow.js 和 Java Servlet 上传文件 0 字节
【发布时间】:2016-02-25 22:06:18
【问题描述】:

我按照说明和对我的 java servlet 的调用在我的项目中添加了 flow.js:

localhost:8080/WebExample/UploadImgServlet?flowChunkNumber=1&flowChunkSize=1048576&flowCurrentChunkSize=693916&flowTotalSize=693916&flowIdentifier=693916-image2png&flowFilename=image2.png&flowRelativePath=image2.png&flowTotalChunks=1`

在我的 servlet 中,我获取了 url 的所有参数(flowChuckNumber、flowChuckSize 等),但是当我尝试获取文件时(request.getInputStream()),它为空并上传 0 个字节。

问题出在哪里?任何的想法?

我发现了一个类似的问题,但它是关于 PHP...

我的代码:

HTML(显示图像):

...
...
<div flow-init="{singleFile:true}"
 flow-file-added="!!{png:1,gif:1,jpg:1,jpeg:1}[$file.getExtension()]"
     flow-files-submitted="$flow.upload()"
     flow-file-success="$file.msg = $message">
         <div class="drop" flow-drop ng-class="dropClass">

        <md-button class="md-raised md-primary" type="file" flow-btn>Upload Image</md-button>
    <b>OR</b>
    Drag And Drop your image here
  </div>
    <div class="thumbnail" ng-show="!$flow.files.length">
      <img src="http://www.placehold.it/200x150/EFEFEF/AAAAAA&text=no+image" alt="Image"/>
    </div>
    <div class="thumbnail" ng-show="$flow.files.length">
      <img flow-img="$flow.files[0]" />
    </div>

  <table>
    <tr ng-repeat="file in $flow.files">
        <td>{{$index+1}}</td>
        <td>{{file.name}}</td>
        <td>{{file.msg}}</td>
    </tr>
  </table>
</div>
...
...

应用 AngularJs:

var app = angular.module("webexample", ['ngMaterial', 'ngNotify','uiGmapgoogle-maps','flow'])
.config(['flowFactoryProvider', function (flowFactoryProvider) {
      flowFactoryProvider.defaults = {
        target: '/WebExample/UploadImgServlet',
        permanentErrors: [404, 500, 501],
        maxChunkRetries: 1,
        chunkRetryInterval: 5000,
        simultaneousUploads: 1
      };
      flowFactoryProvider.on('catchAll', function (event) {
        console.log('catchAll', arguments);
      });
      // Can be used with different implementations of Flow.js
      // flowFactoryProvider.factory = fustyFlowFactory;
    }])
    .directive('appDownloadUrl', [function () {
      return {
        restrict: 'A',
        link: function(scope, element, attrs) {
          element.bind('dragstart', function (event) {
            var config = scope.$eval(attrs.appDownloadUrl);
            if (!config.disabled) {
              var data = config.mime + ':' + config.name + ':' + window.location.href + config.url;
                        console.log("data: "+data);
              event.dataTransfer.setData('DownloadURL', data);
            }
          });
        }
      };
    }])
    .directive("appDragstart", [function () {
      return function(scope, element, attrs) {
        element.bind('dragstart', function (event) {
          scope.$eval(attrs.appDragstart);
        });
      }
    }]).directive("appDragend", [function () {
      return function(scope, element, attrs) {
        element.bind('dragend', function (event) {
          scope.$eval(attrs.appDragend);
        });
      }
    }]).run(function ($rootScope) {
      $rootScope.dropEnabled = true;
    });

我的 Servlet(我关注了这个 example):

protected void doService(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
    {
        LOGGER.debug("[UploadImgServlet - doService] - init");

        int resumableChunkNumber  = getResumableChunkNumber(request);

        ResumableInfo info = getResumableInfo(request);
        //info contains all flow parameters of the url.

        RandomAccessFile raf = new RandomAccessFile(info.resumableFilePath, "rw");

        //Seek to position
        raf.seek((resumableChunkNumber - 1) * info.resumableChunkSize);

        //Save to file
        InputStream is = request.getInputStream();
        long readed = 0;

        long content_length = request.getContentLength();
        //**PROBLEM: request.getContentLength return -1 so read 0 bytes**


        byte[] bytes = new byte[1024 * 100];
        while(readed < content_length) {
            int r = is.read(bytes);
            if (r < 0)  {
                break;
            }
            raf.write(bytes, 0, r);
            readed += r;
        }
        raf.close();
...
...

【问题讨论】:

    标签: java angularjs servlets jakarta-ee flow-js


    【解决方案1】:

    输入流将为空,因为 flowjs 默认使用 MultiPart 发布内容。 Java 代码的作者指定应该使用“八位字节”进行上传,而不是多部分。

    UploadServlet 接受带有“八位字节”的 Resumable.js 上传

    你需要在你的初始化中添加“method:octet”,

    &lt;div flow-init="{singleFile:true, method:octet}"

    我使用的是 Spring,所以我只是使用 MultipartHttpServletRequest 来获取使用 MultiPart 发布的数据,因为 MultiPart 更常见。

    这是我收到文件内容的方式:

    Iterator<String> itr = request.getFileNames();
    
    /* Iterate each file, there should only be one/one chunk */
    while (itr.hasNext()) {
        fileUploaded = request.getFile(itr.next());
        raf.write(fileUploaded.getBytes());
    }
    
    raf.close();
    

    我不得不对提供的 java 代码进行更多修复,因为它估计接收错误的块数,所以我只使用了“flowTotalChunks”参数。

    【讨论】:

      【解决方案2】:

      您无需担心内容长度。 HttpServletRequest 将在正确的点终止输入流。只需阅读直到流结束。

      【讨论】:

      • if try "while ((read = uploadInputStream.read(bytes)) != -1)" 结果是一样的,第一个读数是-1所以上传0字节。
      • 然后什么都没有发送。
      • 我知道,但我想知道为什么文件没有通过 Flowjs 发送以及如何修复它。我找到了这个:stackoverflow.com/questions/25740110/… 但结果是一样的,文件没有发送。
      • 您是否尝试过其他浏览器?在检查了我的之后,它确实收到了数据,但是即使您收到一些输入,您也会遇到其他问题,因为 Java 代码在 Javascript 方面并不完全是最新的。
      【解决方案3】:

      我想要一个库来上传比默认 html 输入具有更多选项和视觉吸引力(从文件夹中删除文件、缩略图等)的图像,但我无法使用 Flowjs 和 Java Servlet,所以我寻找另一个库:

      https://github.com/danialfarid/ng-file-upload

      https://angular-file-upload.appspot.com/

      有了这个库,我发现它很容易与 Java Servlet 一起使用。

      如果有人找到使用 Flowjs 的方法,我不会将此帖子标记为已解决。

      【讨论】:

      • 我认为 flow.js 与 angular 配合得很好,所以我也尝试使用并遇到了和你一样的问题。问题似乎出在 Java 代码中,它似乎已经过时并且没有查看 currentChunkSize,最终认为它没有收到所有块。我会尽力修复它并通知您。
      • @user1384975 我找到了我所说的另一个库,它工作正常,所以我忘记了 Flowjs,尽管 Flowjs 更完整一些。如果你找到了 Flowjs 的解决方案,请告诉我。
      • 找到解决方案,我已经发布了。您需要设置八位字节的上传类型,否则需要处理多部分帖子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      相关资源
      最近更新 更多