小编Dav*_*avz的帖子

在play framework 2.0中将文件上传为流

我正在编写一个允许用户上传文件的Play 2.0 java应用程序.这些文件存储在我使用Java库访问的第三方服务上,我在此API中使用的方法具有以下签名:

void store(InputStream stream, String path, String contentType)
Run Code Online (Sandbox Code Playgroud)

我已设法使用以下简单的控制器使上传工作:

public static Result uploadFile(String path) {
    MultipartFormData body = request().body().asMultipartFormData();
    FilePart filePart = body.getFile("files[]");
    InputStream is    = new FileInputStream(filePart.getFile())
    myApi.store(is,path,filePart.getContentType()); 
    return ok();
  }
Run Code Online (Sandbox Code Playgroud)

我担心的是这个解决方案效率不高,因为默认情况下,play框架将客户端上传的所有数据存储在服务器上的临时文件中,然后在控制器中调用uploadFile()方法.

在传统的servlet应用程序中,我会编写一个以这种方式运行的servlet:

myApi.store(request.getInputStream(), ...)
Run Code Online (Sandbox Code Playgroud)

我一直在寻找,没有找到任何解决方案.我找到的最接近的例子是为什么调用错误或在BodyParser的Iteratee中完成请求在Play Framework 2.0中挂起?但我没有找到如何修改它以满足我的需要.

在play2中是否有一种方法可以实现这种行为,即客户端上传的数据是否可以将Web应用程序直接"传递"到另一个系统?

谢谢.

java upload stream playframework-2.0

15
推荐指数
1
解决办法
4515
查看次数

比较两个在字典级别上按词典相同但不相同的字符串

我正在寻找一种方法来比较两个字典级别的词典等效但不相同的Java字符串.

更准确地说,使用以下文件名"baaaé.png",在字节级别它可以用两种不同的方式表示:

[ 98,97,97,97,-61,-87,46,112,110,103 ] - >"é"用2个字节编码

[ 98,97,97,97,101,-52,-127,46,112,110,103 ] - >"é"用3个字节编码

    byte[] ch = {98, 97, 97, 97, -61, -87, 46, 112, 110, 103};
    byte[] ff = {98, 97, 97, 97, 101, -52, -127, 46, 112, 110, 103};

    String st = new String(ch,"UTF-8");
    String st2 = new String(ff,"UTF-8");
    System.out.println(st);
    System.out.println(st2);
    System.out.println(st.equals(st2));
Run Code Online (Sandbox Code Playgroud)

将生成以下输出:

baaaé.png
baaae?.png
false
Run Code Online (Sandbox Code Playgroud)

有没有办法进行比较,以便equals方法返回true?

java string utf-8

10
推荐指数
2
解决办法
1129
查看次数

使用播放框架和第三方API流式传输大型文件

我正在写一个播放2应用程序,我正在努力解决文件流问题.我使用第三方API检索我的文件,其方法具有以下签名:

FileMetadata getFile(OutputStream destination, String fileId)
Run Code Online (Sandbox Code Playgroud)

在传统的Servlet应用程序中,如果我想将内容发送到我的客户端,我会做类似的事情:

HttpServletResponse resp;
myService.getFile(resp.getOutpuStream, fileId);
Run Code Online (Sandbox Code Playgroud)

我的问题是,在我的Play 2 Controller类中,我无法访问底层的OuputStream,因此我的控制器方法的最简单实现是:

public static downloadFile(String id) {
    ByteArrayOutputStream baos = new BAOS(...);
    myApi.getFile(baos,id); //Load inside temp Array      
    ByteArrayInputStream bais = new BAIS(baos.toByteArray())
    return Ok(bais);
 }
Run Code Online (Sandbox Code Playgroud)

它可以工作,但它需要在服务之前将整个内容加载到内存中,因此它不是一个选项(文件可能很大).

我在考虑一个解决方案,包括:

  • 在我的控制器中定义ByteArrayOutputStream(baos)
  • 使用此参数中的baos调用第三方API
  • 一旦第三方API写入内容,就使用play框架的块返回来发送baos的内容

问题是我不知道是否可能(调用getFile是阻塞所以它需要多个线程与共享的OutputStream),也不是它有点过分.

有人遇到过这种问题并找到了解决方案吗?我提议的解决方案能解决我的问题吗

任何见解将不胜感激.

谢谢

编辑1 基于kheraud建议我已经设法有一个工作但仍然不完美的解决方案(下面的代码).

不幸的是,如果在调用getFile方法期间出现问题,则不会将错误发送回客户端(因为我返回了Ok)并且浏览器无限期地等待一个永远不会出现的文件.

有办法处理这种情况吗?

public static Result downloadFile(String fileId {    
      Thread readerThread = null;
      try {
          PipedOutputStream pos = new PipedOutputStream();
          PipedInputStream pis = new PipedInputStream(pos); 
          //Reading must be done in another thread
          readerThread …
Run Code Online (Sandbox Code Playgroud)

java streaming playframework

7
推荐指数
1
解决办法
5895
查看次数