为了获得完整的想法,该项目由一个带有下载按钮的网页组成,单击该按钮后,将文本文件下载到用户计算机。该网页使用Javascript和PHP,后者将调用Java AWS Lambda函数。java从数据库中获取文本。
最初,我让它在本地工作:
StreamFactory sf = StreamFactory.newInstance();
sf.loadResource("mapping.xml");
File file = new File("C:\test.txt");
BeanWriter bw = sf.createWriter("export", file);
// beans written bellow
...
bw.write(recordName, bean);
然而,由于使用Lambda函数的性质,我无法像保存到本地那样轻松地保存到服务器(需要通过SSH编程等)。此外,我的学长要求我让我的项目不必将文件保存到服务器上,这样我们以后就不必管理删除它们了。
我现在一直在尝试这样做:
StreamFactory sf = StreamFactory.newInstance();
sf.loadResource("mapping.xml");
OutputStreamWriter output;
BeanWriter bw = sf.createWriter("export", output);
// beans written bellow
...
bw.write(recordName, bean);
我读过createWriter可以使用编写器而不是文件,但我不明白如何在javascript端使用它作为文件下载。目前,这一端的代码很简单,看起来像这样:
<a href="http://website.com/location/test.txt"download="test.txt">Download</a>
此项目未使用servlet。我的大四学生对使用AWS Lambda和向流式写作持坚定态度。它需要使用BeanIO。我看到的大多数类似的问题都没有这些挑战,所以这个问题不应该因为重复而被关闭。
我对AWS Lambda一无所知,但谷歌搜索让我学会了利用预定义接口创建处理程序(Java),特别是Example 2: Creating Handler with Stream Input/Output (Leverage the RequestStreamHandler Interface)
。在本文中,您可以使用接口提供的Outputstream
将您的响应写回给用户。
这可能会触发类似于文件下载请求的事件,然后浏览器可以显示结果,也可以要求用户将响应保存为计算机上的文件。
结合你的代码:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import org.beanio.BeanWriter;
import org.beanio.StreamFactory;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.amazonaws.services.lambda.runtime.Context;
public class HelloBeanIO implements RequestStreamHandler {
public void handleRequest(InputStream inputStream,
OutputStream outputStream,
Context context)
throws IOException {
StreamFactory sf = StreamFactory.newInstance();
sf.loadResource("mapping.xml");
// wrap the supplied OutputStream in a OutputStreamWriter
// and set the encoding you prefer
OutputStreamWriter writer = new OutputStreamWriter(outputStream,
StandardCharsets.UTF_8);
BeanWriter bw = sf.createWriter("export", writer);
// beans written bellow
...
bw.write(recordName, bean);
}
}
重要的部分是用OutputStreamWriter
包装传递到方法中的OutputStream
。
很可能还有更多的事情要做才能让它正常工作,不知何故,为响应设置正确的mime类型可能会改变浏览器处理响应的行为。