2016-02-13 10 views
7

के बजाय मल्टीपार्ट एक्सेप्शन प्राप्त करने से अधिक हो जाती है, तो मेरे पास सरल स्प्रिंगबूट ऐप फ़ाइल अपलोड करने की कार्यक्षमता है जहां अधिकतम फ़ाइल अपलोड फ़ाइल आकार 2 एमबी है।स्प्रिंगबूट जब फ़ाइल अपलोड आकार सीमा MaxUploadSizeExceededException

मैंने multipart.max-file-size=2MB कॉन्फ़िगर किया है यह ठीक काम कर रहा है। लेकिन जब मैं 2 एमबी आकार से बड़ी फ़ाइलों को अपलोड करने का प्रयास करता हूं, तो मैं उस त्रुटि को संभालना चाहता हूं और त्रुटि संदेश दिखाना चाहता हूं।

उसके लिए मैं अपने नियंत्रक HandlerExceptionResolverresolveException() साथ कार्यान्वयन को लागू करता है इस प्रकार है:

public ModelAndView resolveException(HttpServletRequest request, 
      HttpServletResponse response, Object handler, Exception exception) 
    {   
     Map<String, Object> model = new HashMap<String, Object>(); 
     if (exception instanceof MaxUploadSizeExceededException) 
     { 
      model.put("msg", exception.getMessage()); 
     } else 
     { 
      model.put("msg", "Unexpected error: " + exception.getMessage()); 
     } 

     return new ModelAndView("homepage", model); 
    } 

समस्या अपवाद इम हो रही MultipartException बजायहै MaxUploadSizeExceededException है।

स्टैकट्रैक है: मल्टीपार्ट सर्वलेट अनुरोध का विश्लेषण नहीं कर सका; नेस्टेड अपवाद java.lang.IleglegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase $ FileSizeLimitExceededException: फ़ील्ड myFile 2097152 बाइट्स के अधिकतम अनुमत आकार से अधिक है।

फ़ाइल आकार के मामले में मुझे क्यों नहीं मिलता है मुझे MaxUploadSizeExceededException क्यों मिल रहा है? मुझे इसके माता-पिता अपवाद मल्टीपार्ट अपवाद मिल रहा है जिसे फ़ाइल आकार के अतिरिक्त कई अन्य कारणों से लिया जा सकता है।

इस पर कोई विचार?

उत्तर

2

मुझे एक ही समस्या का सामना करना पड़ा, ऐसा लगता है कि कॉमन्स फ़ाइल अपलोड कार्यान्वयन के मल्टीपार्ट रीसोलवर को MaxUploadSizeExceededException फेंकता है लेकिन मल्टीपार्ट रीसोल्वर सर्वलेट 3.0 कार्यान्वयन नहीं है।

यहां मैंने जो किया है, वह यहां है। यहां कुंजी को नियंत्रक पर फ़ाइल को जांचने की अनुमति देना था, फिर आप आकार को सत्यापित कर सकते हैं और एक त्रुटि सेट कर सकते हैं। अधिकतम फ़ाइल आकार: नीचे बहुखण्डीय

  1. बहुखण्डीय गुण सेट -1 अधिकतम-अनुरोध आकार: -1

  2. सेट बिलाव 8 (maxSwallowSize = "- 1")

  3. नियंत्रक पर, आकार की जाँच करने के

    अगर (fileAttachment.getSize()> 10485760) { फेंक नई MaxUploadSizeExceededException (fileAttachment.g तर्क जोड़ने etSize()); application.properties में }

-2

निम्न मान मेरे लिए काम किया। यह यह स्वीकार्य फ़ाइल आकार असीमित

multipart.maxFileSize=-1 

multipart.maxRequestSize=-1 
+0

https://spring.io/guides/gs/uploading-files/ – Amol

+0

इस के रूप में लिखा है के बारे में सवाल का जवाब नहीं लगता है यदि बड़ी फ़ाइल अपलोड की जाती है और मनमानी आकार वाली फ़ाइल को अपलोड करने के बारे में नहीं, तो अपवाद को कैसे पकड़ें। –

0

यह बहुत अच्छा नहीं है बनाने लगता है, लेकिन मेरे त्वरित और गंदी समाधान अगर MultipartException संदेश स्ट्रिंग पाठ SizeLimitExceededException निहित देख सकते हैं और उस संदेश से अधिकतम फ़ाइल आकार जानकारी निकालने के लिए जाँच करने के लिए किया गया था।

मेरे मामले में, टॉमकैट 8.0 पर अपवाद फेंक दिया जा रहा है।एक्स था org.apache.tomcat.util.http.fileupload.FileUploadBase $ SizeLimitExceededException: अनुरोध खारिज कर दिया गया था, क्योंकि इसका आकार (177,351) कॉन्फ़िगर अधिकतम (2048)

ध्यान रखें से अधिक है, के रूप में aalmero ने कहा, यदि आप StandardServletMultipartResolver के बजाय CommonsMultipartResolver का उपयोग करते हैं, तो MaxUploadSizeExceededException को फेंक दिया जाएगा जो संभालने के लिए बहुत अच्छा है। निम्नलिखित कोड एक MultipartException या तो बहुखण्डीय समाधानकर्ता रणनीति द्वारा फेंका संभालता है:

@ControllerAdvice 
public class MultipartExceptionExceptionHandler { 
    @ExceptionHandler(MultipartException.class) 
    public String handleMultipartException(MultipartException ex, RedirectAttributes ra) { 
    String maxFileSize = getMaxUploadFileSize(ex); 
    if (maxFileSize != null) { 
     ra.addFlashAttribute("errors", "Uploaded file is too large. File size cannot exceed " + maxFileSize + "."); 
    } 
    else { 
     ra.addFlashAttribute("errors", ex.getMessage()); 
    } 
    return "redirect:/"; 
    } 

    private String getMaxUploadFileSize(MultipartException ex) { 
    if (ex instanceof MaxUploadSizeExceededException) { 
     return asReadableFileSize(((MaxUploadSizeExceededException)ex).getMaxUploadSize()); 
    } 
    String msg = ex.getMessage(); 
    if (msg.contains("SizeLimitExceededException")) { 
     String maxFileSize = msg.substring(msg.indexOf("maximum")).replaceAll("\\D+", ""); 
     if (StringUtils.isNumeric(maxFileSize)) { 
     return asReadableFileSize(Long.valueOf(maxFileSize)); 
     } 
    } 

    return null; 
    } 

    // http://stackoverflow.com/a/5599842/225217 
    private static String asReadableFileSize(long size) { 
    if(size <= 0) return "0"; 
    final String[] units = new String[] { "B", "kB", "MB", "GB", "TB" }; 
    int digitGroups = (int) (Math.log10(size)/Math.log10(1024)); 
    return new DecimalFormat("#,##0.#").format(size/Math.pow(1024, digitGroups)) + " " + units[digitGroups]; 
    } 
} 
संबंधित मुद्दे