2014-06-21 6 views
45

क्या कोई मुझे बता सकता है कि एक मल्टीपार्ट फ़ाइल (org.springframework.web.multipart.MultipartFile) को फ़ाइल (java.io.File) में कनवर्ट करने का सबसे अच्छा तरीका क्या है?एक मल्टीपार्ट फ़ाइल को फ़ाइल में कैसे परिवर्तित करें?

मेरी वसंत MVC वेब परियोजना में मैं मल्टीपार्ट file.I के रूप में अपलोड की गई फ़ाइल हो रही है यह एक फ़ाइल (आईओ), वहाँ सामने मैं इस छवि संग्रहीत सेवा (Cloudinary) कॉल कर सकते हैं कन्वर्ट करने के लिए है.वे केवल ले प्रकार (फ़ाइल)।

मैंने इतनी सारी खोजें की हैं लेकिन असफल रही हैं। अगर कोई अच्छा मानक तरीका जानता है तो कृपया मुझे बताएं? Thnx

+3

वहाँ कुछ है कि आप विधि 'MultipartFile.transferTo()' का उपयोग करने से रोकता है है? – fajarkoe

उत्तर

119

आप getBytes विधि का उपयोग कर multipartFile की सामग्री प्राप्त कर सकते हैं और आप FileOutputStream वर्ग का उपयोग करके File वर्ग का एक उदाहरण बना सकते हैं।

public File convert(MultipartFile file) 
{  
    File convFile = new File(file.getOriginalFilename()); 
    convFile.createNewFile(); 
    FileOutputStream fos = new FileOutputStream(convFile); 
    fos.write(file.getBytes()); 
    fos.close(); 
    return convFile; 
} 

तुम भी उपयोग करें transferTo method कर सकते हैं:

public File multipartToFile(MultipartFile multipart) throws IllegalStateException, IOException 
{ 
    File convFile = new File(multipart.getOriginalFilename()); 
    multipart.transferTo(convFile); 
    return convFile; 
} 
+2

मैंने हस्तांतरण के लिए फ़ंक्शन का उपयोग किया लेकिन मुझे लगता है कि कोई समस्या है। जैसे यह स्थानीय मशीन के लिए ड्राइव करने के लिए temp फ़ाइल रखता है। – Ronnie

+0

@ रोनी मुझे एक ही समस्या है। क्या आपको कोई कामकाज मिला है? –

+0

org.apache.commons.io.FileUtils.deleteQuietly (convFile.getParentFile()); , यह अस्थायी फ़ाइल को हटा देना चाहिए @ रोनी – kavinder

2

तुम भी Apache Commons IO पुस्तकालय और FileUtils class उपयोग कर सकते हैं। यदि आप मेवेन का उपयोग कर रहे हैं तो आप उपर्युक्त निर्भरता का उपयोग करके इसे लोड कर सकते हैं।

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
</dependency> 

मल्टीपार्टफाइल डिस्क पर सहेजने का स्रोत।

File file = new File(directory, filename); 

// Create the file using the touch method of the FileUtils class. 
// FileUtils.touch(file); 

// Write bytes from the multipart file to disk. 
FileUtils.writeByteArrayToFile(file, multipartFile.getBytes()); 
+0

'FileUtils.touch()' यहां व्यर्थ और अपमानजनक दोनों है। अब आप 'नई फ़ाइलऑटपुटस्ट्रीम()' (ओएस के माध्यम से) को फाइल करने के लिए बाध्य कर रहे हैं ताकि फाइल बनाई जा सके * और * एक नया बनाएं। – EJP

+0

आपकी टिप्पणी के लिए धन्यवाद। मैंने FileUtils.writeByteArrayToFile विधि के स्रोत की जांच की। मुझे लगता है कि यह विधि फ़ाइल में मौजूद नहीं है (संस्करण 2.4)। मल्टीपार्टफाइल ऑब्जेक्ट में अपलोड की गई फ़ाइल के बाइट्स शामिल हैं जिन्हें हम फाइल सिस्टम में कहीं भी स्टोर करना चाहते हैं। मेरा उद्देश्य इस बाइट को किसी पसंदीदा स्थान पर स्टोर करना है। FileUtils.touch विधि रखने का एकमात्र कारण यह स्पष्ट करना है कि यह एक नई फ़ाइल है। FileUtils.writeByteArrayToFile फ़ाइल (और पूर्ण पथ) बनाता है यदि यह अस्तित्व में नहीं है तो FileUtils.touch की आवश्यकता नहीं है। –

2

आप कास्टिंग अगर इंटरफ़ेस MultipartFile के वर्ग CommonsMultipartFile है द्वारा वसंत में tempfile पहुँच सकते हैं।

public File getTempFile(MultipartFile multipartFile) 
{ 
    CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile; 
    FileItem fileItem = commonsMultipartFile.getFileItem(); 
    DiskFileItem diskFileItem = (DiskFileItem) fileItem; 
    String absPath = diskFileItem.getStoreLocation().getAbsolutePath(); 
    File file = new File(absPath); 

    //trick to implicitly save on disk small files (<10240 bytes by default) 
    if (!file.exists()) { 
     file.createNewFile(); 
     multipartFile.transferTo(file); 
    } 

    return file; 
} 

10240 बाइट्स maxInMemorySize संपत्ति @Configuration@EnableWebMvc कक्षा में 0 पर सेट किया जा सकता है की तुलना में कम फाइलों के साथ चाल से छुटकारा पाने के। उसके बाद, सभी अपलोड की गई फाइलों को डिस्क पर संग्रहीत किया जाएगा।

@Bean(name = "multipartResolver") 
    public CommonsMultipartResolver createMultipartResolver() { 
     CommonsMultipartResolver resolver = new CommonsMultipartResolver(); 
     resolver.setDefaultEncoding("utf-8"); 
     resolver.setMaxInMemorySize(0); 
     return resolver; 
    } 
+1

'createNewFIle() 'यहां व्यर्थ और अपर्याप्त दोनों है। अब आप 'नई फ़ाइलऑटपुटस्ट्रीम()' (ओएस के माध्यम से) को फाइल करने के लिए बाध्य कर रहे हैं ताकि फाइल बनाई जा सके * और * एक नया बनाएं। – EJP

+0

@EJP हां, यह व्यर्थ था, अब मैं संपादन करते समय इस गलती को ठीक करता हूं। लेकिन createNewFIle() कचरा नहीं है, क्योंकि यदि CommonsMultipartFile 10240 बाइट्स से कम है, तो फाइल सिस्टम में फ़ाइल नहीं बनाई गई है। इसलिए किसी भी अद्वितीय नाम के साथ एक नई फ़ाइल (मैंने डिस्कफाइल इटैम का नाम इस्तेमाल किया) एफएस में बनाया जाना चाहिए। – Alex78191

+0

@ Alex78191 डिस्क छोटी फ़ाइलों (डिफ़ॉल्ट रूप से <10240 बाइट्स) पर पूरी तरह से सहेजकर आपका क्या मतलब है। सीमा –

8

हालांकि स्वीकार किए जाते हैं जवाब सही है, लेकिन यदि आप सिर्फ cloudinary अपनी छवि अपलोड करने की कोशिश कर रहे हैं, वहाँ एक बेहतर तरीका है:

Map upload = cloudinary.uploader().upload(multipartFile.getBytes(), ObjectUtils.emptyMap()); 

multipartFile जहाँ आपके org.springframework.web.multipart है .MultipartFile

1

Alex78191 द्वारा दिए गए उत्तर ने मेरे लिए काम किया है।

public File getTempFile(MultipartFile multipartFile) 
{ 

CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile; 
FileItem fileItem = commonsMultipartFile.getFileItem(); 
DiskFileItem diskFileItem = (DiskFileItem) fileItem; 
String absPath = diskFileItem.getStoreLocation().getAbsolutePath(); 
File file = new File(absPath); 

//trick to implicitly save on disk small files (<10240 bytes by default) 

if (!file.exists()) { 
    file.createNewFile(); 
    multipartFile.transferTo(file); 
} 

return file; 
} 

आकार से अधिक 10240 बाइट्स 1 एमबी तक multipartResolver में maxInMemorySize बदलें होने फ़ाइलों को अपलोड करने के लिए।

<bean id="multipartResolver" 
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
<!-- setting maximum upload size t 20MB --> 
<property name="maxUploadSize" value="20971520" /> 
<!-- max size of file in memory (in bytes) --> 
<property name="maxInMemorySize" value="1048576" /> 
<!-- 1MB --> </bean> 
+0

'maxInMemorySize' के पास फ़ाइल अपलोड आकार पर सीमा के साथ कुछ लेना देना नहीं है। फ़ाइल अपलोड आकार 'maxUploadSize' संपत्ति द्वारा सेट किया गया है। – Alex78191

+0

10240 बाइट्स 'maxInMemorySize' प्रोप से कम फ़ाइलों के साथ चाल से छुटकारा पाने के लिए '0' पर सेट किया जा सकता है। – Alex78191

+0

@ Alex78191 मैंने इसे बदल दिया है और यह मेरे लिए काम करता है। मैंने फ़ाइल को कनवर्ट करने के लिए अपना कोड इस्तेमाल किया था। इसलिए मैंने स्मृति सीमाओं से छुटकारा पाने के लिए applicationcontext.xml में गुणों को बदल दिया। और यह काम करता है !!! –

0
@PetrosTsialiamanis पोस्ट पर

छोटे सुधार, new File(multipart.getOriginalFilename()) इस जहां कुछ समय आप उपयोगकर्ता के लिए लिखने की अनुमति मुद्दों का सामना करना पड़ेगा सर्वर स्थान में फ़ाइल पैदा करेगा, इसकी हमेशा संभव नहीं हर उपयोगकर्ता के लिए जो प्रदर्शन करने के लिए लिखने की अनुमति देने के लिए कार्रवाई। System.getProperty("java.io.tmpdir") temp निर्देशिका तैयार करेगा जहां आपकी फ़ाइल ठीक से बनाई जाएगी। इस तरह आप temp फ़ोल्डर बना रहे हैं, जहां फ़ाइल बनाई गई है, बाद में आप फ़ाइल या अस्थायी फ़ोल्डर को हटा सकते हैं।

public static File multipartToFile(MultipartFile multipart, String fileName) throws IllegalStateException, IOException { 
    File convFile = new File(System.getProperty("java.io.tmpdir")+"/"+fileName); 
    multipart.transferTo(convFile); 
    return convFile; 
} 

इस विधि को अपनी सामान्य उपयोगिता में डाल दें और उदाहरण के लिए इसका उपयोग करें। Utility.multipartToFile(...)

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