当前位置: 首页 > 知识库问答 >
问题:

如何从前端服务器发送文件到后端服务器(上传),前端服务器正在接受客户端浏览器的post请求(表单数据->文件输入)?

百里飞捷
2023-03-14

我试图构建一个前端和后端分离的系统,并通过基于用户令牌的授权rest调用进行交互。前端和后端应用程序都构建在SpringBoot上。Thymeleaf用作呈现html页面的模板引擎。

<form id="doctorDetailsId" enctype="multipart/form-data">
<input name="firstName" placeholder="first name"/>
Profile pic: <input name="photo" type="file"/>
<input name="username" placeholder="user name"/>
<input name="password" placeholder="password"/>
<button type="submit">Submit</button>
</form>
  $("#doctorDetailsId").ajaxForm({
    url: '/doctor/add',
    type: 'post',
    processData: false,
    success: function (data) {
        console.log("Added Doctor! data = " + JSON.stringify(data))
    }
})
@RequestMapping(value = URLConstants.DOCTOR + "/add", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> addDoctor(MultipartHttpServletRequest request, HttpServletResponse response) throws Exception {
    String token = (String) request.getSession().getAttribute("token");
    String role = (String)       request.getSession().getAttribute("userRole");
    if (token != null && !token.isEmpty()) {
        if (role.equals(UserRole.ADMIN.getDescription())) {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String firstName = request.getParameter("firstName");
            MultipartFile multipartFile1 = request.getFile("photo");
//          Part file =   request.getPart("photo");
            DoctorCO doctorCO = new DoctorCO(firstName, multipartFile1);
            .
            .
            .
            String url = backendServerUrl + ":" + backendServerPort + BackApis.ADD_DOCTOR;
            //RequestResponseDTO requestResponseDTO = HttpUtils.postData(url,
                    token, RequestMethod.POST.toString(), doctorCO);
            RequestResponseDTO requestResponseDTO = HttpUtils.postDataWithoutJsonSerialising(url,
                    token, RequestMethod.POST.toString(), doctorCO);
            DoctorDto doctorDto = objectMapper.convertValue(requestResponseDTO.getData(), DoctorDto.class);
            .
            .
            return doctorDto;
        } else {
            return null;
        }
    }
    return null;
}
public String toJson(Object o) {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    if (o == null) {
        return null;
    }
    try {
        return mapper.writeValueAsString(o);
    } catch (Exception e) {
        logger.error(JacksonUtils.class.getSimpleName(), e);
        throw new RuntimeException(e);
    }
}

public static byte[] serialize(Object obj) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ObjectOutputStream os = new ObjectOutputStream(out);
    os.writeObject(obj);
    return out.toByteArray();
}
java.io.NotSerializableException: org.apache.catalina.core.ApplicationPart

当我尝试使用toJson方法时,另一个异常与stackOverflow错误(无限递归)有关

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
2016-12-21 20:23:11.493 ERROR 25797 --- [nio-8082-exec-1] com.src.main.utils.JacksonUtils          : JacksonUtils

com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]-.....>java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileOutputStream["fd"]->java.io.FileDescriptor["parent"])
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:706) ~[jackson-databind-2.8.1.jar:2.8.1]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.1.jar:2.8.1]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693) ~[jackson-databind-2.8.1.jar:2.8.1]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690) ~[jackson-databind-2.8.1.jar:2.8.1]
.
.
.
.

我一直在寻找一个解决方案,以序列化文件从前端服务器到后端服务器相当长的时间。请让我知道这里出了什么问题,或者如果有人有更好的解决方案以这种方式上传文件,请让我知道。如果需要,我很乐意提供更多的细节。

共有1个答案

杨起运
2023-03-14

我试图避免序列化Part或MultipartFile对象。我将MultipartFile对象转换为File对象。序列化没有出现任何类似的错误。

MultipartFile multipartFile1 = request.getFile("photo");
File imageFile = jacksonUtils.getFileOfMultipartFile(multipartFile1);

(以下片段取自此处)

public File getFileOfMultipartFile(MultipartFile multipartFile) throws IOException {
    File convFile = new File(multipartFile.getOriginalFilename());
    convFile.createNewFile();
    FileOutputStream fos = new FileOutputStream(convFile);
    fos.write(multipartFile.getBytes());
    fos.close();
    return convFile;
}
 类似资料:
  • 前端如何把图片上传到服务端? 使用技术:vue2 + elementUI 背景: 前端和后端分别部署到不同的服务器上,前端页面是个表单, 表单里面有上传图片的功能,上传的图片然后在其他页面展示的业务逻辑。后台提供的表单接口要求我只把图片名字(xxxx.png/xxx.jpg)传给他。 问题: 我把生产包放到nginx里的html文件夹后测试。发现没法上传。nginx的配置也做过修改了 vue: n

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 问题内容: 我应该为“ .thrift”文件定义哪种服务,以便以后将其用于我的程序? 此文件传输应该在客户端和服务器之间,并且应该是“部分”。 StreamFileService.thrift: StreamFileClient.java: } StreamFileServer.java: } StreamFileServiceImpl: } 问题答案: 您的代码对我来说似乎还不错(未经测试),没

  • 问题内容: 由于我是Web服务的新手,请您告诉我问题的答案。我的问题是 我想实现一个Web服务,当客户端调用此Web服务时,该服务会向客户端发送pdf文件。 请有人帮我提供一段不错的代码或解释。 现在可以请一个人解决我的错误。 12-23 09:42:48.429:调试/安装(32):DexInv:-开始’/data/app/vmdl33143.tmp’— 12-23 09:42:51.708:调

  • 问题内容: 我想将一些文件上传到HTTP服务器。基本上,我需要的是对服务器的某种POST请求,其中包含一些参数和文件。我看到了仅上传文件的示例,但没有找到如何也传递其他参数的示例。 什么是最简单,免费的解决方案?有人有我可以学习的文件上传示例吗?我已经搜寻了几个小时,但是(也许只是那几天)找不到我真正需要的东西。最好的解决方案是不涉及任何第三方类或库的东西。 问题答案: 通常,你会用来触发HTTP