繁体   English   中英

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

[英]How to Send a file to backend server (for upload) from frontend server which is accepting post request from client browser (form data -> file input)?

我正在尝试构建一个系统,其中前端和后端是分开的,并通过基于用户令牌的授权的休息调用进行交互。 前端和后端应用程序都是基于Springboot构建的。 Thymeleaf用作渲染html页面的模板引擎。

我正在尝试为用户上传文件,我将尝试将其保存在后端服务器的文件系统中。 我遇到的问题是我在浏览器上传的文件没有被序列化,无论是byte [](当我尝试将octet-stream作为内容类型发送时)还是作为json(当我尝试将json作为内容发送时) -类型)。

这个问题的相关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>

单击提交按钮时,以下js代码将带参数的ajax调用发送到前端服务器。

  $("#doctorDetailsId").ajaxForm({
    url: '/doctor/add',
    type: 'post',
    processData: false,
    success: function (data) {
        console.log("Added Doctor! data = " + JSON.stringify(data))
    }
})

Ajax请求被正常发送,前端应用程序中的控制器接收请求。

@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;
}

httpUtils.postData()方法执行jackson序列化,而另一个方法获取传递的对象的字节数组。

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();
}

当DoctorCO对象进行序列化时,没有一种方法能够序列化MultipartFile对象。

当我尝试使用serialize方法时会出现此异常。

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]
.
.
.
.

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

我试图避免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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM