0

为了获得完整的想法,该项目包含一个带有下载按钮的网页,单击该按钮时,会将文本文件下载到用户计算机。该网页使用 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。我见过的大多数类似问题都没有这些挑战,所以这个问题不应该因为重复而被关闭。

4

1 回答 1

0

我对 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);
  }
}

重要的部分是您将OutputStream传入的方法用OutputStreamWriter.

很可能需要做更多的事情才能使其正常工作,不知何故,为响应设置正确的 mime 类型可能会改变浏览器处理响应的行为。

于 2017-11-07T23:18:08.290 回答