Jersey Multipart - 缺少起始边界

2023-12-12

我有一个带有 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>

如果我用球衣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 标头中发送包含大写和小写字母的边界,但服务器端的某些操作将其全部转换为小写,导致正文解析失败,并显示“ MIMEParsingException:缺少开始边界。”

在我的例子中,原因是 Jersey 使用 SPI 在运行时加载类,并且它从 Apache CXF 中获取了一个有缺陷的 MediaType 实现,该实现将标头值转换为小写。修复方法是升级/摆脱 CXF,或强制 Jersey 使用不同的 MediaType 实现。

See 泽西-1377更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jersey Multipart - 缺少起始边界 的相关文章

随机推荐

  • Android 2.2 Spinner 在 Actionbar 中看起来很旧

    在 Android 2 2 上 我的 ActionBar 中的 Spinner 看起来非常丑陋 并且下拉文本颜色与背景颜色相同 这使得文本不可读 这是相关代码 spinner new Spinner getSupportActionBar
  • 身份函数:模板和自动的区别

    我正在为我的一些类编写一个身份函数 用于记录其调用的计数 长话短说 指标 目前 我正在尝试计算使用模板与使用模板的性能差异 优点auto 这是从我正在做的代码中摘取的一个简短示例 namespace Metrics unsigned lon
  • QTKit - 合并两个具有不同宽度和高度的视频?

    我刚刚制作了一个简单的应用程序 它使用 QTKit 将两个视频合并在一起 这里是problem 我刚刚发现 如果我尝试合并两个宽度和高度不同的视频 输出的视频的高度和宽度与大视频相同 但包含带有黑色和宽边框的小视频 问题 如何将两个视频合并
  • JavaFX InputMap/ActionMap 等效吗?

    我终于完全切换到 JavaFX 我非常热衷于按键功能 是否有一种与您在 Swing 中找到的 非常好的 热键架构等效的热键架构 对于 JavaFX 文本控制对象 它是如何工作的 我想如果我看一下一切都会变得清楚javafx scene co
  • 函数下的线显示范围

    我不知道这个的确切名称 所以我不知道我在寻找什么 我在一些编程视频中看到 当光标位于函数内部时 它会显示一条位于函数下方的线 然后向下直到函数作用域的末尾 如下图所示 这是一个扩展还是一个设置 我怎样才能启用它 有人可以帮帮我吗 这显然是最
  • PowerShell AzureRM 命令——避免 Save-AzureRMProfile 过期

    我使用以下命令自动化了 Azure 部署AzureRM命令集 这些命令行开关需要登录 所以我尝试使用提供保存的配置文件Save AzureRMProfile Select AzureRMProfile 然而 一段时间后 配置文件似乎过期了
  • 解析javascript中制表符分隔的文件

    我无法更改服务器端 但我得到的文件如下所示 0 20 59339 138402 1 11 20062 75276 2 32 07597 215573 3 12 2029 82012 4 6 800035 45701 5 0 6548425
  • Selenium:在同一选项卡中打开链接

    我通过 Selenium webdriver 单击链接 该链接将打开一个新窗口 我想强制该链接在同一窗口 和同一选项卡 中打开 这可能吗 大多数时候 这种情况不仅仅发生在特定链接上 Thanks 在单击链接之前更新链接的target财产给s
  • 奇怪的 toCharArray() 行为

    我正在尝试toCharArray 并发现一些奇怪的行为 Suppose private static final char HEX CHARS 0123456789abcdef toCharArray System out println
  • Haskell 中快速随机生成器的好选择

    我有一个用例 我想测试一些赌博游戏的程序 我需要的随机数应该在一个非常小的区域 1到9 并且不需要真正的质量 我发现 Haskell 的标准生成器对我来说太慢了 所以有人有更好的想法吗 The 梅森随机纯64包裹非常快 原样MWC 随机
  • 如何使用 bot builder sdk v4 中的中间件区分 Bot 到用户和用户到 Bot 消息?

    我在 sdk V4 Bot 中实现了一个中间件来拦截 bot 和用户之间的每条消息并记录自定义 mongo Db 我正在尝试为使用 SDK v4 构建的 Bot 实现类似的概念 看起来我可以使用以下代码来添加中间件 但是不确定如何区分机器人
  • 如何在 swift 中设置 NSUserDefault 中的字典?

    我有一个可变字典 以 Int Int 的形式 并希望保存它 我会像这样使用 NSUserDefaults var myDic NSMutableDictionary myDic 1 2 NSUserDefaults standardUser
  • 如果产品价格高于 Woocommerce 中的特定金额,请在产品价格前添加文本

    在 Woocommerce 中我尝试添加文本before价格如果高于 59 欧元 我尝试了以下代码 以及其他代码 但它们不起作用 add filter woocommerce get price html custom price mess
  • 错误 C2446:==:没有从 const char * 到 TCHAR * 的转换

    我有一个 TCHAR 定义如下 TCHAR szProcessName MAX PATH TEXT
  • “纯虚函数调用”消息框

    我的一个 C Winforms 应用程序随机显示一个 纯虚函数调用 消息框 当我单击该消息框的确定按钮时应用程序立即关闭 我在应用程序日志文件中找不到任何异常 并且事件日志为空 谁能告诉我这次崩溃的可能原因以及如何进一步分析问题的根本原因
  • 如何用 ImageIcon 完全填充 JButton 的表面?

    我尝试用 ImageIcon 完全填充 Jbutton 的 表面 到目前为止我的结果是 正如您所看到的 退出 标签的边缘和按钮的边缘之间仍然存在一些空间 您可以看到背景上有白蓝色填充的按钮 我想要的是用标签完全覆盖这个按钮 有没有办法做到这
  • 如何使 For 循环处理非整数

    以下代码很简单并且输出符合预期 CODE Option Explicit Sub Test loop2 Dim i As Long For i 3 To 3 Step 1 Debug Print i Next i End Sub OUTPU
  • 如何使用母版从 asp:content 页面访问母版页上的用户控件?

    我不断收到 让我成为一个做 xyz 的工具 的请求web app我们正在准备 因此 在第三次之后 我意识到将它们全部放在一起并使用母版页会更容易 我有一个名为 MessageCenter 的用户控件 用于显示错误 成功和参考消息 因此我将其
  • 无需清除即可重新喷漆

    我正在开发一个模仿 Paint 的程序 问题是当我绘制新形状时 以前的形状会被删除 我试图注释掉我对paintComponents的超级调用 它可以工作 但留下了太多的绘图 import java awt Color import java
  • Jersey Multipart - 缺少起始边界

    我有一个带有 Netty 的 jersy 2 13 服务器应用程序 我尝试上传带有 multipart form data 的文件 但出现此错误 错误信息 7605 10 01 49 309 child group 3 1 org jvne