我有一个带有 Netty 的 jersy 2.13 的服务器应用程序,我尝试上传带有“multipart/form-data”的文件,但出现此错误。
错误信息:
7605 10:01:49.309 [child-group-3-1] org.jvnet.mimepull.MIMEParsingException: Missing start boundary
66242 08:57:42.713 [child-group-3-1] ERROR ROOT - No codec available to display error for 'Content-Type:multipart/form-data; boundary=----webkitformboundaryv4kegleyi4tkjp8j'
我的依赖
compile group: "org.glassfish.jersey.core", name: "jersey-server", version: "2.13"
compile group: "org.glassfish.jersey.media", name: "jersey-media-json-jackson", version: "2.13"
compile group: "org.glassfish.jersey.media", name: "jersey-media-multipart", version: "2.13"
我的资源:
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void uploadFile(@FormDataParam("file") InputStream stream, @FormDataParam("file") FormDataContentDisposition contentDispositionHeader)
{
System.out.println("Enter uploadFile");
String outputPath = "C:/upload/";
java.nio.file.Path outPath = FileSystems.getDefault().getPath(outputPath, contentDispositionHeader.getFileName());
try
{
Files.copy(stream, outPath);
}
catch (IOException e)
{
throw Throwables.propagate(e);
}
}
我的应用程序:
public JerseyApplication()
{
super(JacksonMapper.class, JacksonFeature.class);
register(new InjectionBinder());
register(new MultiPartFeature());
register(new MyFileUploader());
}
我的客户测试
<form action="http://localhost/api/upload" method="post" enctype="multipart/form-data">
<p><input id="uploadInput" type="file" name="file"></p>
<p><input type="submit" formenctype="multipart/form-data" value="Send file"></p>
</form>
如果我使用了 Jersey 1.8 (
compile group: "com.sun.jersey.contribs", name: "jersey-multipart", version: "1.18.3"
),如果我删除了 FormDataContentDisposition
就可以了来自函数 uploadFile
.如果我不删除它,我在启动时会出现此错误: WARNING: No injection source found for a parameter of type public void com.fs.ss.communication.jersey.FileUploader.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0.
1621 09:39:10.974 [main] ERROR ROOT - Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public void com.fs.ss.communication.jersey.FileUploader.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.fs.ss.communication.jersey.FileUploader, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@599545b6]}, definitionMethod=public void com.fs.ss.communication.jersey.FileUploader.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file, defaultValue=null], Parameter [type=class com.sun.jersey.core.header.FormDataContentDisposition, source=file, defaultValue=null]], responseType=void}, nameBindings=[]}']
org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public void com.fs.ss.communication.jersey.FileUploader.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.fs.ss.communication.jersey.FileUploader, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@599545b6]}, definitionMethod=public void com.fs.ss.communication.jersey.FileUploader.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file, defaultValue=null], Parameter [type=class com.sun.jersey.core.header.FormDataContentDisposition, source=file, defaultValue=null]], responseType=void}, nameBindings=[]}']
at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:467)
at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:163)
at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:323)
at org.glassfish.jersey.internal.Errors$2.call(Errors.java:289)
at org.glassfish.jersey.internal.Errors$2.call(Errors.java:286)
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.processWithException(Errors.java:286)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:320)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:273)
at com.fs.ss.communication.protocol.http.HttpJerseyServerHandler.register(HttpJerseyServerHandler.java:195)
at com.fs.ss.communication.protocol.http.HttpServerInitializer.setJerseyResources(HttpServerInitializer.java:167)
at com.fs.ss.communication.CommunicationService.addServer(CommunicationService.java:309)
at com.fs.ss.communication.CommunicationService.initialize(CommunicationService.java:383)
at com.fs.ss.communication.CommunicationService.startApp(CommunicationService.java:399)
at com.fs.ss.communication.app.AbstractApplication.start(AbstractApplication.java:147)
at com.fs.ss.communication.CommunicationServiceBootstrap.main(CommunicationServiceBootstrap.java:40)
如果我删除
FormDataContentDisposition
来自 uploadFile
函数我的文件内容如下:------WebKitFormBoundaryATOqpm55xXBvTACH
Content-Disposition: form-data; name="file"; filename="mytxt.txt"
Content-Type: text/plain
my file content
------WebKitFormBoundaryATOqpm55xXBvTACH--
最佳答案
我在 Jersey 中遇到了类似的问题,其中使用 Chrome 时分段文件上传会失败,但使用 Firefox 会成功。
正如 plemay 所提到的,问题是 Chrome 在 Content-Type header 中发送了一个包含大写和小写字母的边界,但服务器端的某些内容正在将其全部转换为小写,导致正文解析失败,并显示“MIMEParsingException:缺少起始边界。”
在我的案例中,原因是 Jersey 在运行时使用 SPI 加载类,并且它从 Apache CXF 中获取了一个有问题的 MediaType 实现,该实现将 header 值转换为小写。解决方法是升级/摆脱 CXF,或强制 Jersey 使用不同的 MediaType 实现。
见 JERSEY-1377更多细节。
关于Jersey Multipart - 缺少起始边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27403904/