【问题标题】:BeanIO - how to write so user can download a file not saved to the serverBeanIO - 如何编写以便用户可以下载未保存到服务器的文件
【发布时间】:2017-11-08 07:18:08
【问题描述】:

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

【问题讨论】:

    标签: java aws-lambda bean-io


    【解决方案1】:

    我对 AWS-Lambda 一无所知,但谷歌搜索让我找到了 Leveraging Predefined Interfaces for Creating Handler (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 类型可能会改变浏览器处理响应的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 2010-10-07
      • 1970-01-01
      相关资源
      最近更新 更多