Vertx3.0 die Einfache Form hochladen

Vertx3.0 http simpleform Datei-uploader wirft Fehler für mehrere Dateien.

Bin mit vertx3.0 die einfache form hochladen. Es ist gut, wenn ich den upload einer einzelnen Datei. Wenn das Formular über die Eingabe von „mehrere“ und wählen Sie mehrere Dateien, Die HTTPServerUpload wirft Fehler „- Antwort schon geschrieben hat“. Seit der Antwort ist Ende im endhandler für den 1. – Datei, es wirft dieser Fehler für die nachfolgende Dateien. gibt es eine andere Möglichkeit für mehrere Dateien ?

Simpleform Datei upload mit vertx3.0

public class SimpleFormUploadServer extends AbstractVerticle {


    public static void main(String[] args) {
        Runner.runExample(SimpleFormUploadServer.class);
    }

    @Override
    public void start() throws Exception {
        vertx.createHttpServer()
                .requestHandler(req -> {
                    if (req.uri().equals("/")) {
                        //Serve the index page
                        req.response().sendFile("index.html");
                    } else if (req.uri().startsWith("/form")) {
                        req.setExpectMultipart(true);
                        req.uploadHandler(upload -> {
                            upload.exceptionHandler(cause -> {
                                req.response().setChunked(true)
                                        .end("Upload failed");
                            });

                            upload.endHandler(v -> {
                                req.response()
                                        .setChunked(true)
                                        .end("Successfully uploaded to "
                                                + upload.filename());
                            });
                            //FIXME - Potential security exploit! In a real
                            //system you must check this filename
                            //to make sure you're not saving to a place where
                            //you don't want!
                            //Or better still, just use Vert.x-Web which
                            //controls the upload area.
                            upload.streamToFileSystem(upload.filename());
                        });
                    } else {
                        req.response().setStatusCode(404);
                        req.response().end();
                    }
                }).listen(8080);

    }
}

Exception :

SEVERE: Unhandled exception
java.lang.IllegalStateException: Response has already been written
    at io.vertx.core.http.impl.HttpServerResponseImpl.checkWritten(HttpServerResponseImpl.java:561)
    at io.vertx.core.http.impl.HttpServerResponseImpl.end0(HttpServerResponseImpl.java:389)
    at io.vertx.core.http.impl.HttpServerResponseImpl.end(HttpServerResponseImpl.java:307)
    at io.vertx.core.http.impl.HttpServerResponseImpl.end(HttpServerResponseImpl.java:292)
    at com.nokia.doas.vertx.http.upload.SimpleFormUploadServer$1$1$2.handle(SimpleFormUploadServer.java:85)
    at com.nokia.doas.vertx.http.upload.SimpleFormUploadServer$1$1$2.handle(SimpleFormUploadServer.java:1)
    at io.vertx.core.http.impl.HttpServerFileUploadImpl.notifyEndHandler(HttpServerFileUploadImpl.java:213)
    at io.vertx.core.http.impl.HttpServerFileUploadImpl.lambda$handleComplete$165(HttpServerFileUploadImpl.java:206)
    at io.vertx.core.file.impl.AsyncFileImpl.lambda$doClose$226(AsyncFileImpl.java:470)
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$16(ContextImpl.java:335)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:358)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
    at java.lang.Thread.run(Unknown Source)


index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>

<form action="/form" ENCTYPE="multipart/form-data" method="POST" name="wibble">
    choose a file to upload:<input type="file"  name="files" multiple="multiple"/><br>
    <input type="submit"/>
</form>

</body>
</html>
InformationsquelleAutor Gogs | 2016-02-24



2 Replies
  1. 1

    Können Sie vertx-web, einfache Handhabung von Datei-uploads:

    router.route().handler(BodyHandler.create());
    
    router.post("/some/path/uploads").handler(routingContext -> {
    
        Set<FileUpload> uploads = routingContext.fileUploads();
        //Do something with uploads....
    });
    

    Darüber hinaus nehmen Sie die Vorteile der routing-Einrichtung, und Sie können sogar serve static files wie index.html.

    Hoffe, das wird helfen.

  2. 0

    Mehrere Datei-upload ist erreichbar in vert.x. Verwenden Sie mehrere upload-button, in HTML und benutzen uploadHandler von HttpRequest. UploadHandler würde aufgerufen werden, so oft viele Dateien hochgeladen wurden.

        HttpServerRequest request = routingContext.request();
        request.setExpectMultipart(true);
        request.endHandler(new Handler<Void>() {
            @Override
            public void handle(Void aVoid) {
                MultiMap entries = request.formAttributes();
                Set<String> names = entries.names();
                logger.info("UPLOAD_CONTENT: fileName = "+entries.get("fileName"));
                logger.info("UPLOAD_CONTENT: type = "+entries.get("type"));
                logger.info("UPLOAD_CONTENT: names = "+names);
                request.response().setChunked(true).end(createResponse("SUCCESS"));
            }
        });
        //This would be called multiple times
        request.uploadHandler(upload -> {
    
            upload.exceptionHandler(new Handler<Throwable>() {
                @Override
                public void handle(Throwable error) {
                    logger.error("UPLOAD_CONTENT: Error while uploading content "+upload.filename());
                    logger.error("UPLOAD_CONTENT: error = "+error.toString());
                    error.printStackTrace();
                    request.response().setChunked(true).end(createResponse("FAILURE"));
                }
            });
            upload.endHandler(new Handler<Void>() {
                @Override
                public void handle(Void aVoid) {
                    logger.info("UPLOAD_CONTENT: fileName = "+upload.filename());
                    logger.info("UPLOAD_CONTENT: name = "+upload.name());
                    logger.info("UPLOAD_CONTENT: contentType = "+upload.contentType());
                    logger.info("UPLOAD_CONTENT: size = "+upload.size());
                    UtilityFunctions.uploadToS3(upload.filename(), "testfolder");
    
                }
            });
            upload.streamToFileSystem(upload.filename());
        });
    

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.