移动端上传报错,pc不报错

xhr.open('POST', '#(local)/upload?token='+token, true);

    that = this;

    xhr.onreadystatechange = function () {

      if (xhr.readyState === 4 && xhr.status === 200) {

        var response = JSON.parse(xhr.responseText);

        that.dockeys.push(response);

        options.onSuccess();

      }else{

    options.onFailure();

      }

    };

    const formData = new FormData();

    formData.append('file', options.sourceFile);

    formData.append("enctype", 'multipart/form-data');

   xhr.send(formData);


后端

UploadFile uploadFile = getFile("file");

用pc浏览器上传文件正常的,但是在手机端上传就会报错,求大佬指导


java.lang.RuntimeException: java.io.IOException: Corrupt form data: premature ending

at com.jfinal.upload.MultipartRequest.wrapMultipartRequest(MultipartRequest.java:140)

at com.jfinal.upload.MultipartRequest.<init>(MultipartRequest.java:82)

at com.jfinal.core.Controller.getFiles(Controller.java:894)

at com.jfinal.core.Controller.getFile(Controller.java:904)

at com.demo.index.IndexController.upload(IndexController.java:84)

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 com.jfinal.aop.Invocation.invoke(Invocation.java:97)

at com.jfinal.core.ActionHandler.handle(ActionHandler.java:110)

at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:90)

at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)

at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)

at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)

at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)

at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)

at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)

at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)

at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)

at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)

at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)

at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)

at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)

at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)

at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)

at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)

at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

at io.undertow.servlet.handlers.SessionRestoringHandler.handleRequest(SessionRestoringHandler.java:119)

at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)

at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)

at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)

at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)

at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)

at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)

at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)

at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:79)

at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:100)

at io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)

at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)

at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)

at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)

at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)

at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)

at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)

at java.lang.Thread.run(Thread.java:748)


评论区

JFinal

2025-02-21 14:47

异常提示上传数据提前结束了,移动端上传文件的代码有问题

移动端用的什么工具? 找一个更好封装的工具进行文件上传, 直接问 deep seek 有惊喜

q76267454

2025-02-21 14:50

移动端用浏览器是可以的,但是在钉钉客户端上传就报错,波总有遇到过吗

JFinal

2025-02-21 14:59

@q76267454 没有碰到过,可能是你用的那段代码的兼容性不好,直接问 deep seek 比啥都快

q76267454

2025-02-21 15:45

@JFinal iOS钉钉小程序不支持使用formData格式上传文件,这个波总还有什么办法吗

JFinal

2025-02-21 16:12

deep seek 给了很多方法,提示词我照抄的你的稍加改动:iOS钉钉小程序不支持使用formData格式上传文件,有什么办法可以支持上传文件到 http 服务端吗?

回复的摘要如下:
方法一:使用钉钉原生上传API
钉钉小程序提供了dd.uploadFile接口,支持以multipart/form-data格式上传文件,无需手动构造FormData。
uploadFile(filePath) {
dd.uploadFile({
url: 'https://your-server.com/upload',
fileType: 'image', // 或 'file'
fileName: 'file', // 表单字段名,与服务端一致
filePath: filePath,
formData: {
// 附加的其他表单字段
userId: '123'
},
success: (res) => {
console.log('上传成功', res.data);
},
fail: (err) => {
console.error('上传失败', err);
}
});
}

方法二:Base64编码:
步骤 1:读取文件为Base64
dd.getFileSystemManager().readFile({
filePath: filePath,
encoding: 'base64',
success: (res) => {
const base64Data = res.data;
this.uploadBase64(base64Data);
}
});

步骤 2:通过HTTP请求发送
uploadBase64(base64Data) {
dd.httpRequest({
url: 'https://your-server.com/upload',
method: 'POST',
headers: { 'Content-Type': 'application/json' },
data: {
file: base64Data,
fileName: 'example.jpg'
},
success: (res) => {
console.log('上传成功', res.data);
}
});
}

q76267454

2025-02-21 16:43

好的 感谢波总@JFinal

JFinal

2025-02-21 16:51

@q76267454 你再调整提示词,不断追问 deep seek ,问题很快就能得到解决

有不少人在说 AI 会取代软件工程师,其实 AI 只会让咱们更强

还有人说有了 AI 人人都可以是程序员,但他们没想过 AI 生成的代码非专业的连代码都看不懂,AI 给生成出来的代码,他们知道怎么用? ^_^

q76267454

2025-02-21 16:58

@JFinal 确实,ai能提升效率,同时让一个人能干两人的活
也算是取代了吧,哈哈哈

热门反馈

扫码入社