如何使用 JQuery Dropzone 将额外参数传递给我的 java 控制器方法

How to pass extra parameter with JQuery Dropzone to my java controller method

我有一个 dropzone 功能来上传 pdf 文件并在我的控制器方法中接收它以处理和保存在数据库中,但我需要传递一个额外的参数,它是 select 的值,我已经通过它,但我在控制器方法中收到“空”值。

这是 mi JQuery dropzone 方法:

 ...
 $("div#uploadFile").dropzone({ 
                        
     url: "/demo/uploadFile"
     ,params: {
               name: $( "#selectedName" ).val()
              }
    ,acceptedFiles: ".pdf"
    ,clickable: false
    ,maxFilesize: 100
    ,addRemoveLinks: true
    ,init: function() {
                         
              this.on('addedfile', function(file) {
                         //i can see the value in alert
                         alert($( "#selectedName" ).val()); 
              });
              this.on('success', function(file, json) {
                         alert("ok");
              });
               
  });

控制器方法(尝试在请求参数中接收):

 @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
        public ResponseEntity<?> uploadFile( @RequestParam("name") String name, MultipartFile file)  {

          //here print parameter and is  NULL
          System.out.println("My extra param received is : "+ name);
         
         //process the file-pdf
          ...
          ....

}

有什么想法吗?提前致谢!

您可以在 JS 端将任何文件转换为字节数组并在 java 端对其进行解码,因此您可以发送字节数组而不是文件。在你的 JS 端使用类似这样的东西(你应该向这个 JS 方法添加承诺):

function getBufferArray(file) {
   var fr = new FileReader();
   fr.readAsArrayBuffer(file);
   return new Uint8Array(fr.result);
}

在你的 java 那边:

public class BASE64DecodedMultipartFile implements MultipartFile {
        private final byte[] imgContent;

        public BASE64DecodedMultipartFile(byte[] imgContent) {
            this.imgContent = imgContent;
        }

        @Override
        public String getName() {
            // TODO - implementation depends on your requirements 
            return null;
        }

        @Override
        public String getOriginalFilename() {
            // TODO - implementation depends on your requirements
            return null;
        }

        @Override
        public String getContentType() {
            // TODO - implementation depends on your requirements
            return null;
        }

        @Override
        public boolean isEmpty() {
            return imgContent == null || imgContent.length == 0;
        }

        @Override
        public long getSize() {
            return imgContent.length;
        }

        @Override
        public byte[] getBytes() throws IOException {
            return imgContent;
        }

        @Override
        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(imgContent);
        }

        @Override
        public void transferTo(File dest) throws IOException, IllegalStateException { 
            new FileOutputStream(dest).write(imgContent);
        }
    }

对于参数,请尝试添加到您的拖放区:

        params: {
            new_value: 'value'
        },

你能试试吗:

 $("div#uploadFile").dropzone({ 
                        
     url: "/demo/uploadFile"
    ,acceptedFiles: ".pdf"
    ,clickable: false
    ,maxFilesize: 100
    ,addRemoveLinks: true
    ,init: function() {
                         
              this.on('addedfile', function(file) {
                         //i can see the value in alert
                         alert($( "#selectedName" ).val()); 
              });
              this.on("sending", function(file, xhr, formData) {
                        formData.append("name", $( "#selectedName" ).val());
                        console.log(formData);
              });
              this.on('success', function(file, json) {
                         alert("ok");
              });
               
  });