如何将表单数据从 java 脚本发送到 java 过滤器?

问题描述 投票:0回答:0

我正在尝试将包含图像文件的表单数据从 java 脚本发送到 java servlet 过滤器。以下是ajax请求的代码

function displayCard() {
  addProductBtn.disabled = true;
  event.preventDefault();
  
  if(checkProductName(productNameField,productNameError)
   && checkProductImage(productImageField,productImageError) 
   && checkDescription(productDescField,productDescError,counter)
   && checkPrice(productPriceField,productPriceError)
   && checkDiscount(productDiscountField,productDiscountError)) {
    
    var request = new XMLHttpRequest();
    request.open("POST","product/add",true);
    request.setRequestHeader("Content-Type","multipart/form-data");
    // Set the Content-Type header to multipart/form-data
    var formData = new FormData();
    formData.append("productName", productNameField.value.trim());
    formData.append("productImage", productImageField.files[0]);
    formData.append("productDescription", productDescField.value.trim());
    formData.append("productPrice", productPriceField.value.trim());
    formData.append("productDiscount", productDiscountField.value.trim());
    request.send(formData);

    request.onreadystatechange = function(){
      if(request.readyState === XMLHttpRequest.DONE) {
        if(request.status === 200){
            var data = JSON.parse(request.responseText);
            if(data.success){
                closeForm();
                createItemCard(data.success.id);
                showAlert("Added successfully!","#15A78C","#DFFFD8","#A0E4CB");
            }
            else{
                productNameError.innerText =data.errors.nameError;
                productImageError.innerText =data.errors.imageError;
                productDescError.innerText = data.errors.descriptionError;
                productPriceError.innerText = data.errors.priceError;
                productDiscountError.innerText = data.errors.discountError;
            }
        }else{
            ///Error message
            showAlert("Oops! Something went wrong.","#FFFFFF","#FF7C7C","#E52315");
        }
      }
    };
  }
  addProductBtn.disabled = false;
}

但是当我试图在我的 java 过滤器中检索表单信息时,我得到了 null。 我正在检索如下信息,

package com.clothify.filters;

import com.clothify.controller.ImageHandler;
import com.clothify.filters.supporter.ErrorTextGenerator;
import com.clothify.filters.supporter.Validator;
import org.json.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.PrintWriter;

@MultipartConfig
public class ProductValidator implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)  {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String method = request.getMethod();
        PrintWriter out = null;
        if(method.equals("POST") || method.equals("PUT")) {
            try {
                out = response.getWriter();

                String productName = request.getParameter("productName");
                Part imageFile = request.getPart("productImage");
                String productDescription = request.getParameter("productDescription");
                String productPrice = request.getParameter("productPrice");
                String productDiscount = request.getParameter("productDiscount");
                byte[] imageBytes = ImageHandler.getImageBytes(imageFile);

                JSONObject result = new JSONObject();

                if (!Validator.isNameValid(productName)) {
                    result.put("nameError", ErrorTextGenerator.getNameErrorText(productName));
                }
                if (!Validator.isImageValid(imageBytes)) {
                    result.put("imageError", ErrorTextGenerator.getImageErrorText(imageBytes));
                }
                if (!Validator.isDescriptionValid(productDescription)) {
                    result.put("descriptionError", ErrorTextGenerator.getDescriptionErrorText(productDescription));
                }
                if (!Validator.isPriceValid(productPrice)) {
                    result.put("priceError", ErrorTextGenerator.getPriceErrorText(productPrice));
                }
                if (!Validator.isDiscountValid(productDiscount)) {
                    result.put("discountError", ErrorTextGenerator.getDiscountErrorText(productDiscount));
                }

                if (result.length() > 0) {
                    out.println("{\"result\": " + result + " }");
                }
                else{
                    double price = Double.parseDouble(productPrice);
                    int discount = Integer.parseInt(productDiscount);

                    request.setAttribute("productPrice",price);
                    request.setAttribute("productDiscount",discount);
                    request.setAttribute("productImage",imageBytes);
                }
            }
            catch (ServletException e){e.printStackTrace();}
            catch (IOException e){e.printStackTrace();}
            finally {
                if(out!=null){
                    out.close();
                }
            }
        }
        try {
            filterChain.doFilter(request,response);
        }
        catch (IOException e) {e.printStackTrace(); }
        catch (ServletException e) {e.printStackTrace();}
    }
}

我检查了浏览器中的网络选项卡,请求负载包含我在表单中提供的所有信息。但是当我试图在我的 java 过滤器中检索它时,我得到了 null。

javascript ajax xmlhttprequest multipartform-data servlet-filters
© www.soinside.com 2019 - 2024. All rights reserved.