gpt4 book ai didi

java - 在 Play Framework 2.0 中将文件作为流上传

转载 作者:太空狗 更新时间:2023-10-29 22:56:41 24 4
gpt4 key购买 nike

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

void store(InputStream stream, String path, String contentType)

我已经设法使用以下简单的 Controller 进行上传:

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();
}

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

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

myApi.store(request.getInputStream(), ...)

我一直在到处寻找,没有找到任何解决方案。我找到的最接近的例子是 Why makes calling error or done in a BodyParser's Iteratee the request hang in Play Framework 2.0?但我没有找到如何修改它以满足我的需要。

在 play2 中有没有办法实现这种行为,即让客户端上传的数据“通过”网络应用程序直接到另一个系统?

谢谢。

最佳答案

我已经能够使用以下 Scala Controller 代码将数据流式传输到我的第三方 API:

def uploadFile() = 
Action( parse.multipartFormData(myPartHandler) )
{
request => Ok("Done")
}

def myPartHandler: BodyParsers.parse.Multipart.PartHandler[MultipartFormData.FilePart[Result]] = {
parse.Multipart.handleFilePart {
case parse.Multipart.FileInfo(partName, filename, contentType) =>
//Still dirty: the path of the file is in the partName...
String path = partName;

//Set up the PipedOutputStream here, give the input stream to a worker thread
val pos:PipedOutputStream = new PipedOutputStream();
val pis:PipedInputStream = new PipedInputStream(pos);
val worker:UploadFileWorker = new UploadFileWorker(path,pis);
worker.contentType = contentType.get;
worker.start();

//Read content to the POS
Iteratee.fold[Array[Byte], PipedOutputStream](pos) { (os, data) =>
os.write(data)
os
}.mapDone { os =>
os.close()
Ok("upload done")
}
}
}

UploadFileWorker 是一个非常简单的 Java 类,它包含对第三方 API 的调用。

public class UploadFileWorker extends Thread {
String path;
PipedInputStream pis;

public String contentType = "";

public UploadFileWorker(String path, PipedInputStream pis) {
super();
this.path = path;
this.pis = pis;
}

public void run() {
try {
myApi.store(pis, path, contentType);
pis.close();
} catch (Exception ex) {
ex.printStackTrace();
try {pis.close();} catch (Exception ex2) {}
}
}

它并不完全完美,因为我更愿意将路径恢复为 Action 的参数,但我一直未能这样做。因此,我添加了一段 javascript,用于更新输入字段的名称(以及 partName),它可以解决问题。

关于java - 在 Play Framework 2.0 中将文件作为流上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12066993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com