我正在编写一个允许用户上传文件的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字符串.
更准确地说,使用以下文件名"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?
我正在写一个播放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)
它可以工作,但它需要在服务之前将整个内容加载到内存中,因此它不是一个选项(文件可能很大).
我在考虑一个解决方案,包括:
问题是我不知道是否可能(调用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)