spring mvc - मैं मल्टीपार्ट/फॉर्म और चंक एन्कोडिंग दोनों का उपयोग कर वसंत एमवीसी में फ़ाइल अपलोड कैसे प्राप्त करूं?




spring-mvc file-upload (2)

इसके लिए नियंत्रक यहां है

package com.faisalbhagat.web.controller;

@Controller
@RequestMapping(value = { "" })
public class UploadController {

    @RequestMapping(value = "/uploadMyFile", method = RequestMethod.POST)
    @ResponseBody
    public String handleFileUpload(MultipartHttpServletRequest request)
            throws Exception {
        Iterator<String> itrator = request.getFileNames();
        MultipartFile multiFile = request.getFile(itrator.next());
                try {
            // just to show that we have actually received the file
            System.out.println("File Length:" + multiFile.getBytes().length);
            System.out.println("File Type:" + multiFile.getContentType());
            String fileName=multiFile.getOriginalFilename();
            System.out.println("File Name:" +fileName);
            String path=request.getServletContext().getRealPath("/");

            //making directories for our required path.
            byte[] bytes = multiFile.getBytes();
            File directory=    new File(path+ "/uploads");
            directory.mkdirs();
            // saving the file
            File file=new File(directory.getAbsolutePath()+System.getProperty("file.separator")+picture.getName());
            BufferedOutputStream stream = new BufferedOutputStream(
                    new FileOutputStream(file));
            stream.write(bytes);
            stream.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new Exception("Error while loading the file");
        }
        return toJson("File Uploaded successfully.")
    }

    public String toJson(Object data)
    {
        ObjectMapper mapper=new ObjectMapper();
        StringBuilder builder=new StringBuilder();
        try {
            builder.append(mapper.writeValueAsString(data));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return builder.toString();
    }
}

आप http://faisalbhagat.blogspot.com/2014/09/springmvc-fileupload-with-ajax-and.html पर क्लाइंट साइड कोड के साथ पूर्ण समाधान पा सकते हैं

मैं एक वसंत एमवीसी विधि लिखने की कोशिश कर रहा हूं जो या तो मल्टीपार्ट / फॉर्म या ट्रांसफर-एन्कोडिंग चंक फ़ाइल अपलोड कर सकता है। मैं प्रत्येक प्रकार को संभालने के लिए एक अलग विधि लिख सकता हूं लेकिन मैं इसे उसी विधि से करना चाहता हूं ताकि मैं उसी रीस्ट पोस्ट यूरी का उपयोग कर सकूं जैसे कि:

http://host:8084/attachments/testupload

अब तक मेरा सबसे अच्छा प्रयास है:

@RequestMapping(value = { "/testupload" }, method = RequestMethod.POST, produces = 
  "application/json")
public @ResponseBody
ResponseEntity<MessageResponseModel> testUpload(
  @RequestParam(value = "filedata", required = false) MultipartFile filedata,
  final HttpServletRequest request) throws IOException {

  InputStream is = null;
  if (filedata == null) {
    is = request.getInputStream();
  }
  else {
    is = filedata.getInputStream();
  }
  byte[] bytes = IOUtils.toByteArray(is);
  System.out.println("read " + bytes.length + " bytes.");

  return new ResponseEntity<MessageResponseModel>(null, null, HttpStatus.OK);
}

उपर्युक्त विधि का उपयोग करके मैं एक मल्टीपार्ट फ़ाइल अपलोड कर सकता हूं, लेकिन अगर मैं एक खंडित फ़ाइल अपलोड करता हूं तो मुझे वसंत से अपवाद मिलता है जो कहता है:

org.springframework.web.multipart.MultipartException: \
The current request is not a multipart request

यदि मैं मल्टीपार्टफाइल अनुरोध पैरामीटर को हटा देता हूं तो यह हस्तांतरण एन्कोडिंग के लिए बहुत अच्छा काम करता है। यदि मैं इसे छोड़ देता हूं तो मल्टीपार्टफ़ाइल अपलोड के लिए बहुत अच्छा काम करता है। अपलोड अपलोड प्रकारों को संभालने के लिए मैं इसे उसी विधि से कैसे कर सकता हूं?

यह खंडित के लिए ठीक काम करता है:

@RequestMapping(value = { "/testupload" }, method = RequestMethod.POST, produces = 
  "application/json")
public @ResponseBody
ResponseEntity<MessageResponseModel> testUpload(
  final HttpServletRequest request) throws IOException {

  InputStream is = null;
  is = request.getInputStream();
  byte[] bytes = IOUtils.toByteArray(is);
  System.out.println("read " + bytes.length + " bytes.");

  return new ResponseEntity<MessageResponseModel>(null, null, HttpStatus.OK);
}

और यह MultipartFile के लिए बहुत अच्छा काम करता है:

@RequestMapping(value = { "/testupload" }, method = RequestMethod.POST, produces = 
  "application/json")
public @ResponseBody
ResponseEntity<MessageResponseModel> testUpload(
  @RequestParam MultipartFile filedata) throws IOException {

  InputStream is = null;
  is = filedata.getInputStream();
  byte[] bytes = IOUtils.toByteArray(is);
  System.out.println("read " + bytes.length + " bytes.");

  return new ResponseEntity<MessageResponseModel>(null, null, HttpStatus.OK);
}

यह संभव होना चाहिए, क्या कोई यह जानता है कि यह कैसे करें?

धन्यवाद, स्टीव


मेरे कोड से उद्धरण (वसंत 3.2, एंजुलरजेएस के साथ ब्लूंप फ़ाइल अपलोड):

/**
 * Handles chunked file upload, when file exceeds defined chunked size.
 * 
 * This method is also called by modern browsers and IE >= 10
 */
@RequestMapping(value = "/content-files/upload/", method = RequestMethod.POST, headers = "content-type!=multipart/form-data")
@ResponseBody
public UploadedFile uploadChunked(
        final HttpServletRequest request,
        final HttpServletResponse response) {

    request.getHeader("content-range");//Content-Range:bytes 737280-819199/845769
    request.getHeader("content-length"); //845769
    request.getHeader("content-disposition"); // Content-Disposition:attachment; filename="Screenshot%20from%202012-12-19%2017:28:01.png"
    request.getInputStream(); //actual content.

    //Regex for content range: Pattern.compile("bytes ([0-9]+)-([0-9]+)/([0-9]+)");
    //Regex for filename: Pattern.compile("(?<=filename=\").*?(?=\")");

    //return whatever you want to json
    return new UploadedFile();
}

/**
 * Default Multipart file upload. This method should be invoked only by those that do not
 * support chunked upload.
 * 
 * If browser supports chunked upload, and file is smaller than chunk, it will invoke
 * uploadChunked() method instead.
 * 
 * This is instead a fallback method for IE <=9
 */
@RequestMapping(value = "/content-files/upload/", method = RequestMethod.POST, headers = "content-type=multipart/form-data")
@ResponseBody
public HttpEntity<UploadedFile> uploadMultipart(
        final HttpServletRequest request,
        final HttpServletResponse response,
        @RequestParam("file") final MultipartFile multiPart) {

    //handle regular MultipartFile

    // IE <=9 offers to save file, if it is returned as json, so set content type to plain.
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.TEXT_PLAIN);
    return new HttpEntity<>(new UploadedFile(), headers);
}

इससे आप कार्य शुरू कर पाएंगे। आईई 8, आईई 9, आईई 10, क्रोम, एफएफ पर न्यूनतम परीक्षण किया गया। बेशक वहाँ समस्याएं हो सकती हैं, और शायद सामग्री श्रेणियों को निकालने का एक आसान तरीका है, लेकिन .. मेरे लिए काम करता है।





multipartform-data