2016-06-16 8 views
6

पर संग्रहीत किए बिना बड़े मल्टीपार्ट फ़ाइल अपलोड को स्ट्रीम करने के लिए कैसे करें स्प्रिंग बूट का डिफ़ॉल्ट मल्टीपार्ट रीसोल्वर इंटरफ़ेस स्थानीय फ़ाइल सिस्टम पर संग्रहीत करके मल्टीपार्ट फ़ाइलों को अपलोड करने को संभालता है। नियंत्रक विधि दर्ज करने से पहले, संपूर्ण मल्टीपार्ट फ़ाइल को सर्वर पर अपलोड करना समाप्त होना चाहिए।वसंत - स्थानीय फ़ाइल सिस्टम

हम अपनी सभी अपलोड की गई फ़ाइलों को सीधे डेटाबेस में संग्रहीत कर रहे हैं और हमारे सर्वरों में बहुत छोटी डिस्क कोटा है, इसलिए यदि बड़ी फ़ाइल अपलोड की जाती है, तो हम IOExeption - Disk quota exceeded देख रहे हैं।

क्या स्प्रिंग के मल्टीपार्ट रीसोलवर फ़ाइल को स्थानीय फाइल सिस्टम पर संग्रहीत करने से पहले सीधे क्लाइंट के आने वाले अनुरोध से स्ट्रीम प्राप्त करने का कोई तरीका है ताकि हम सीधे हमारे डीबी पर स्ट्रीम कर सकें?

+0

क्या डेटाबेस का उपयोग कर रहे? – Songo

+0

हम एडब्ल्यूएस एस 3 – McLovin

उत्तर

5

आप यहां https://commons.apache.org/proper/commons-fileupload/streaming.html वर्णित अनुसार अपाचे का उपयोग कर सकते हैं।

@Controller 
public class UploadController { 

    @RequestMapping("/upload") 
    public String upload(HttpServletRequest request) throws IOException, FileUploadException { 

     ServletFileUpload upload = new ServletFileUpload(); 

     FileItemIterator iterator = upload.getItemIterator(request); 
     while (iterator.hasNext()) { 
      FileItemStream item = iterator.next(); 

      if (!item.isFormField()) { 
       InputStream inputStream = item.openStream(); 
       //... 
      } 
     } 
    } 
} 

स्प्रिंग्स मल्टीपार्ट समाधान तंत्र को अक्षम करना सुनिश्चित करें।

application.yml:

spring: 
    http: 
     multipart: 
     enabled: false 
4

असल में यह मामूली कार्य नहीं है। यदि आप क्लाइंट से डेटाबेस तक स्ट्रीम लिखना चाहते हैं, तो आपको मैन्युअल रूप से अनुरोध संसाधित करना होगा। कुछ पुस्तकालय हैं, जो इस कार्य को सरल बना सकते हैं। उनमें से एक "Apache Commons FileUpload" है। बहुत सरल उदाहरण के नीचे, आप इस लाइब्रेरी द्वारा आने वाले multipart/form-data अनुरोध को कैसे संसाधित कर सकते हैं। के लिए फ़ाइल क्षेत्र इच्छा

@Controller 
public class Controller{ 

    @RequestMapping("/upload") 
    public String upload(HttpServletRequest request){ 

     String boundary = extractBoundary(request); 

     try { 
      MultipartStream multipartStream = new MultipartStream(request.getInputStream(), 
       boundary.getBytes(), 1024, null); 
      boolean nextPart = multipartStream.skipPreamble(); 
      while(nextPart) { 
       String header = multipartStream.readHeaders(); 

       if(header.contains("filename")){ 
        //if input is file 
        OutputStream output = createDbOutputStream(); 
        multipartStream.readBodyData(output); 
        output.flush(); 
        output.close(); 
       } else { 
        //if input is not file (text, checkbox etc) 
        ByteArrayOutputStream output = new ByteArrayOutputStream(); 
        multipartStream.readBodyData(output); 
        String value = output.toString("utf-8"); 
        //... do something with extracted value 
       } 
       nextPart = multipartStream.readBoundary(); 
      } 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     }  
    } 

    private String extractBoundary(HttpServletRequest request) { 
     String boundaryHeader = "boundary="; 
     int i = request.getContentType().indexOf(boundaryHeader)+ 
      boundaryHeader.length(); 
     return request.getContentType().substring(i); 
    }  
} 

हैडर लगता है:

Content-Disposition: form-data; name="fieldName"; filename="fileName.jpg" 
Content-Type: image/jpeg 

सरल क्षेत्र इच्छा के लिए हैडर की तरह दिखता है:

Content-Disposition: form-data; name="fieldName"; 

ध्यान दें, कि इस स्निपेट उदाहरण सरलीकृत है आप दिशा दिखाने के लिए । इसमें कुछ विवरण नहीं हैं: हेडर से फील्ड नाम निकालें, डेटाबेस आउटपुट स्ट्रीम आदि बनाएं। आप इन सभी चीजों को अपने आप से कार्यान्वित कर सकते हैं। मल्टीपार्ट अनुरोध के फ़ील्ड हेडर के उदाहरण आप RFC1867 में पा सकते हैं। multipart/form-dataRFC2388 के बारे में जानकारी।

+0

का उपयोग कर रहे हैं, मुझे यह मुख्य रूप से हेडर '"सामग्री-प्रकार: मल्टीपार्ट/फॉर्म-डेटा; सीमा = ---- वेबकिटफॉर्मबाउंडरी 7MA4YWxkTrZu0gW" -F "filename = test" -F "फ़ाइल = @ myimage के साथ काम कर रहा है। जेपीजी "' – McLovin

संबंधित मुद्दे