Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

how to support file upload?it occurs Exception because DefaultJerseyHandler#shouldReadData return false if Content-Type is multipart/form-data #77

Open
xiongshiyan opened this issue Nov 7, 2019 · 4 comments

Comments

@xiongshiyan
Copy link

DefaultJerseyHandler#shouldReadData will return false if Content-Type is multipart/form-data which leads to the Exception below:

javax.ws.rs.BadRequestException: HTTP 400 Bad Request
	at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:187)
	at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:93)
	at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256)
	at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235)
	at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
	at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:74)
	at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
	at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085)
	at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
	at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808)
	at org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:234)
	at org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider$ValueFactory.getEntity(FormDataParamValueFactoryProvider.java:132)
	at org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider$FormDataParamValueFactory.provide(FormDataParamValueFactoryProvider.java:282)
	at org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71)
	at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:90)
	at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:127)
	at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
	at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
	at com.englishtown.vertx.jersey.impl.DefaultApplicationHandlerDelegate.handle(DefaultApplicationHandlerDelegate.java:49)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.lambda$handle$3(DefaultJerseyHandler.java:266)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.lambda$callVertxRequestProcessor$4(DefaultJerseyHandler.java:291)
	at io.vertx.starter.processor.RequestProcessor.process(RequestProcessor.java:30)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.callVertxRequestProcessor(DefaultJerseyHandler.java:289)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.handle(DefaultJerseyHandler.java:261)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.handle(DefaultJerseyHandler.java:175)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.lambda$handle$1(DefaultJerseyHandler.java:147)
	at io.vertx.core.http.impl.HttpServerRequestImpl.handleEnd(HttpServerRequestImpl.java:406)
	at io.vertx.core.http.impl.ServerConnection.handleEnd(ServerConnection.java:298)
	at io.vertx.core.http.impl.ServerConnection.processMessage(ServerConnection.java:424)
	at io.vertx.core.http.impl.ServerConnection.handleMessage(ServerConnection.java:139)
	at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:615)
	at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:522)
	at io.vertx.core.http.impl.VertxHttpHandler.lambda$channelRead$0(VertxHttpHandler.java:71)
	at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:314)
	at io.vertx.core.impl.OrderedExecutorFactory$OrderedExecutor.lambda$new$0(OrderedExecutorFactory.java:94)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: org.jvnet.mimepull.MIMEParsingException: Missing start boundary
	at org.jvnet.mimepull.MIMEParser.skipPreamble(MIMEParser.java:313)
	at org.jvnet.mimepull.MIMEParser.access$300(MIMEParser.java:68)
	at org.jvnet.mimepull.MIMEParser$MIMEEventIterator.next(MIMEParser.java:149)
	at org.jvnet.mimepull.MIMEParser$MIMEEventIterator.next(MIMEParser.java:132)
	at org.jvnet.mimepull.MIMEMessage.makeProgress(MIMEMessage.java:198)
	at org.jvnet.mimepull.MIMEMessage.parseAll(MIMEMessage.java:181)
	at org.jvnet.mimepull.MIMEMessage.getAttachments(MIMEMessage.java:106)
	at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:230)
	at org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:91)
	at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:182)
	... 49 common frames omitted
@xiongshiyan xiongshiyan changed the title how to support file upload? how to support file upload?it occurs Exception because DefaultJerseyHandler#shouldReadData return false if Content-Type is multipart/form-data Nov 7, 2019
@xiongshiyan
Copy link
Author

and more, I want to ask that why DefaultJerseyHandler#shouldReadData does not support multipart/form-data?

@adrianluisgonzalez
Copy link
Member

This was trying to stay closer to standard vert.x behavior. When you have a stream you should use a data pump or something similar to work with smaller chunks of data as they arrive rather than reading everything into memory.

You can inject the vert.x HttpServerRequest and then use the uploadHandler method.

@xiongshiyan
Copy link
Author

thanks very much, every framework has its own features.

@xiongshiyan
Copy link
Author

it occurs another exception when i use uploadHandler method.

@POST
    @Path("upload")
    public String upload(@Context HttpServerRequest request) {
        request.uploadHandler(uh->{
            String filename = uh.filename();
            System.out.println(filename);
            uh.streamToFileSystem(filename);
            System.out.println(uh.contentType());
        });
        return "Hello World!";
    }
java.lang.IllegalStateException: Request has already been read
	at io.vertx.core.http.impl.HttpServerRequestImpl.checkEnded(HttpServerRequestImpl.java:426)
	at io.vertx.core.http.impl.HttpServerRequestImpl.uploadHandler(HttpServerRequestImpl.java:288)
	at io.vertx.starter.resources.TestResouce.doGet(TestResouce.java:61)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161)
	at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
	at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
	at com.englishtown.vertx.jersey.impl.DefaultApplicationHandlerDelegate.handle(DefaultApplicationHandlerDelegate.java:49)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.lambda$handle$3(DefaultJerseyHandler.java:267)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.lambda$callVertxRequestProcessor$4(DefaultJerseyHandler.java:292)
	at io.vertx.starter.processor.RequestProcessor.process(RequestProcessor.java:30)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.callVertxRequestProcessor(DefaultJerseyHandler.java:290)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.handle(DefaultJerseyHandler.java:262)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.handle(DefaultJerseyHandler.java:176)
	at com.englishtown.vertx.jersey.impl.DefaultJerseyHandler.lambda$handle$1(DefaultJerseyHandler.java:144)
	at io.vertx.core.http.impl.HttpServerRequestImpl.handleEnd(HttpServerRequestImpl.java:406)
	at io.vertx.core.http.impl.ServerConnection.handleEnd(ServerConnection.java:298)
	at io.vertx.core.http.impl.ServerConnection.processMessage(ServerConnection.java:424)
	at io.vertx.core.http.impl.ServerConnection.handleMessage(ServerConnection.java:139)
	at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:615)
	at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:522)
	at io.vertx.core.http.impl.VertxHttpHandler.lambda$channelRead$0(VertxHttpHandler.java:71)
	at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:314)
	at io.vertx.core.impl.OrderedExecutorFactory$OrderedExecutor.lambda$new$0(OrderedExecutorFactory.java:94)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:748)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants