2017-11-07 3 views
0

Um eine vollständige Idee zu erhalten, besteht das Projekt aus einer Webseite mit einem Download-Button, der eine Textdatei auf den Computer des Benutzers herunterlädt. Die Webseite verwendet Javascript und PHP, die eine Java AWS-Lambda-Funktion aufrufen. Der Java greift Text aus einer Datenbank.BeanIO - wie man so schreibt Benutzer kann eine Datei herunterladen nicht auf dem Server gespeichert

Ursprünglich hatte ich es vor Ort als so arbeiten:

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

jedoch aufgrund der Art von Lambda-Funktionen verwendet wird, kann ich nicht so einfach auf den Server speichern, wie ich zu meinem lokalen retten könnte (würde programmgesteuert SSH-ing erfordern, usw.). Außerdem hat mein Senior angefordert, dass ich mein Projekt nicht gezwungen habe, Dateien auf dem Server zu speichern, damit wir sie nicht später löschen müssen.

Ich habe versucht, nun es wie folgt zu tun:

StreamFactory sf = StreamFactory.newInstance(); 
sf.loadResource("mapping.xml"); 
OutputStreamWriter output; 
BeanWriter bw = sf.createWriter("export", output); 

// beans written bellow 
... 
bw.write(recordName, bean); 

ich gelesen habe, dass createWriter einen Schriftsteller statt einer Datei verwenden können, aber ich verstehe nicht, wie das innerhalb verwendet werden könnten die JavaScript-Seite zum Herunterladen als Datei. Derzeit ist der Code an diesem Ende einfach und sieht so aus:

<a href="http://website.com/location/test.txt"download="test.txt">Download</a> 

Dieses Projekt verwendet keine Servlets. Mein Senior ist es, AWS-Lambda zu verwenden und in einen Stream zu schreiben. Es muss BeanIO verwenden. Die meisten der ähnlichen Fragen, die ich gesehen habe, haben diese nicht als Herausforderungen, daher sollte diese Frage nicht als Duplikat geschlossen werden.

Antwort

0

Ich habe keine Kenntnisse über AWS-Lambda, aber googling hat mich zu Leveraging Predefined Interfaces for Creating Handler (Java), speziell Example 2: Creating Handler with Stream Input/Output (Leverage the RequestStreamHandler Interface). Aus dem Artikel könnten Sie dann die von der Schnittstelle zur Verfügung gestellte Outputstream verwenden, um Ihre Antwort an den Benutzer zurückzuschreiben.

Dies würde HOFFNUNGSFÄHIG Ähnliches wie eine Datei-Download-Anfrage auslösen und dann könnte der Browser entweder das Ergebnis anzeigen oder den Benutzer bitten, die Antwort als Datei auf seinem Computer zu speichern.

, dass mit Ihrem Code Kombination:

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

Der wichtigste Teil ist, dass Sie die OutputStream in das Verfahren mit einem OutputStreamWriter bestanden wickeln.

Es gibt wahrscheinlich mehr Dinge zu tun, damit es richtig funktioniert, irgendwie kann das Einstellen des richtigen Mime-Typs für die Antwort das Verhalten der Antwort des Browsers ändern.

Verwandte Themen