মাল্টিপার্ট ফাইলকে কীভাবে ফাইলে রূপান্তর করবেন?


91

মাল্টিপার্ট ফাইল (org.springframework.web.m মাল্টিপার্ট.মલ્ટিয়া পার্টফিলি) ফাইলকে (java.io.File) রূপান্তর করার সর্বোত্তম উপায় কোনটি আমাকে বলতে পারেন?

আমার বসন্তের এমভিসি ওয়েব প্রকল্পে আমি ফাইলটি মাল্টিপার্ট ফাইল হিসাবে আপলোড করছি I আমাকে এটিকে কোনও ফাইল (আইও) তে রূপান্তর করতে হবে, আমি আগে এই ছবিটি স্টোরিং পরিষেবা ( ক্লাউডাইনারি ) বলতে পারি y তারা কেবল টাইপ (ফাইল) নেয়।

আমি অনেকগুলি অনুসন্ধান করেছি কিন্তু ব্যর্থ হয়েছি any যদি কেউ কোনও ভাল মানের উপায় জানেন তবে দয়া করে আমাকে জানান? Thnx


4
এমন কিছু আছে যা আপনাকে পদ্ধতিটি ব্যবহার থেকে বাধা দেয় MultipartFile.transferTo()?
ফাজারকো

উত্তর:


193

আপনি পদ্ধতিটি MultipartFileব্যবহার করে একটি এর সামগ্রী পেতে পারেন getBytesএবং আপনি এটি ব্যবহার করে ফাইলটিতে লিখতে পারেন Files.newOutputStream():

public void write(MultipartFile file, Path dir) {
    Path filepath = Paths.get(dir.toString(), file.getOriginalFilename());

    try (OutputStream os = Files.newOutputStream(filepath)) {
        os.write(file.getBytes());
    }
}

আপনি ট্রান্সফারটো পদ্ধতিও ব্যবহার করতে পারেন :

public void multipartFileToFile(
    MultipartFile multipart, 
    Path dir
) throws IOException {
    Path filepath = Paths.get(dir.toString(), multipart.getOriginalFilename());
    multipart.transferTo(filepath);
}

7
আমি ট্রান্সফারটো ফাংশনটি ব্যবহার করেছি তবে আমি মনে করি একটি সমস্যা আছে। এটি স্থানীয় মেশিনের জন্য ড্রাইভ করতে টেম্পল ফাইল রাখে like
মোরেজ

@ রনি আমারও একই সমস্যা হচ্ছে। আপনি কোন workaround খুঁজে পেয়েছেন?
হাফ ব্লাড প্রিন্স

4
org.apache.commons.io.FileUtils.deleteQuietly (কনফিল.জিটপ্যারেন্টফিল ()); , এটি টেম্পল ফাইল @ রনি
কাভিন্ডার

4
createNewFIle()এখানে অর্থহীন এবং অপব্যয় উভয়ই। আপনি এখন new FileOutputStream()উভয়কে (ওএসের মাধ্যমে) বাধ্যতামূলকভাবে তৈরি করা ফাইলটি মুছুন এবং একটি নতুন তৈরি করুন।
মারকুইস অফ লর্ন

@ পেট্রস সিসিয়ালাম্যানিস জাভাতে কোনও ফাইল রূপান্তর আকারের সীমাবদ্ধতা রাখে কি? ধরা যাক আমি 3 জিবি ফাইল ব্যবহার করছি।
রোহিত

17

যদিও স্বীকৃত উত্তরটি সঠিক তবে আপনি যদি কেবল নিজের চিত্রটি মেঘাবৃতে আপলোড করার চেষ্টা করছেন তবে এর থেকে আরও ভাল উপায় আছে:

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

MultipartFile আপনার কোথায় org.springframework.web.multipart.MultipartFile


17

@ পেট্রোসটসিয়ালাম্যানিস পোস্টে ছোট সংশোধন করার ফলে new File( multipart.getOriginalFilename())এটি সার্ভারের অবস্থানের মধ্যে এমন একটি ফাইল তৈরি করবে যেখানে আপনি কখনও কখনও ব্যবহারকারীর জন্য লেখার অনুমতি সংক্রান্ত সমস্যার মুখোমুখি হবেন , ক্রিয়া সম্পাদনকারী প্রতিটি ব্যবহারকারীর লেখার অনুমতি দেওয়া সবসময় সম্ভব নয়। System.getProperty("java.io.tmpdir")অস্থায়ী ডিরেক্টরি তৈরি করবে যেখানে আপনার ফাইলটি সঠিকভাবে তৈরি হবে created এইভাবে আপনি অস্থায়ী ফোল্ডার তৈরি করছেন, যেখানে ফাইল তৈরি হয়, পরে আপনি ফাইল বা টেম্প ফোল্ডারটি মুছতে পারেন।

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(...)


8

আপনি অ্যাপাচি কমন্স আইও লাইব্রেরি এবং ফাইল ইউটিস ক্লাসও ব্যবহার করতে পারেন । আপনি যদি মার্ভেন ব্যবহার করছেন তবে আপনি উপরের নির্ভরতা ব্যবহার করে এটি লোড করতে পারেন।

<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());

FileUtils.touch()এখানে অর্থহীন এবং অপব্যয় উভয়ই। আপনি এখন new FileOutputStream()উভয়কে (ওএসের মাধ্যমে) বাধ্যতামূলকভাবে তৈরি করা ফাইলটি মুছুন এবং একটি নতুন তৈরি করুন।
লার্নের মারকুইস

আপনার মন্তব্যের জন্য ধন্যবাদ. আমি FileUtils.writeByteArrayToFile পদ্ধতির উত্স পরীক্ষা করেছি। আমি মনে করি যে এই পদ্ধতিটি ফাইলটি বিদ্যমান থাকার ক্ষেত্রে পুনরায় তৈরি করছে না (সংস্করণ ২.৪)। মাল্টিপার্টফিল অবজেক্টে আপলোড করা ফাইলের বাইটস অন্তর্ভুক্ত রয়েছে যা আমরা ফাইল সিস্টেমে কোথাও সঞ্চয় করতে চাই। আমার উদ্দেশ্য হ'ল এই বাইটগুলি পছন্দসই স্থানে সংরক্ষণ করা। আমি ফাইলইউটিস.টিউচ পদ্ধতিটি রাখার একমাত্র কারণ হল এটি একটি নতুন ফাইল clear FileUtils.writeByteArrayToFile ফাইলটি তৈরি করে (এবং পুরো পাথ) যদি এটি উপস্থিত না থাকে তবে ফাইল ইউটিলস.টিউচের প্রয়োজন নেই।
জর্জ সিগগ্রোগলু

7

MultipartFile.transferTo (ফাইল) দুর্দান্ত, তবে সর্বোপরি টেম্প ফাইলটি পরিষ্কার করতে ভুলবেন না।

// ask JVM to ask operating system to create temp file
File tempFile = File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_POSTFIX);

// ask JVM to delete it upon JVM exit if you forgot / can't delete due exception
tempFile.deleteOnExit();

// transfer MultipartFile to File
multipartFile.transferTo(tempFile);

// do business logic here
result = businessLogic(tempFile);

// tidy up
tempFile.delete();

নীচে JVM প্রস্থান (যা অত্যন্ত বিরল হতে পারে) এর উপর মৃত্যুদন্ড কার্যকর করা হয়েছে এমন ফাইল.ডিলিটঅনএক্সিট () সম্পর্কে রাজ্জেরোর মন্তব্য দেখুন।


4
deleteOnExit(), এটি কেবলমাত্র JVM সমাপ্ত হলে ট্রিগার করবে, তাই ব্যতিক্রমের সময় এটি ট্রিগার করবে না। এর কারণে আপনাকে deleteOnExit()দীর্ঘমেয়াদী অ্যাপ্লিকেশন যেমন সার্ভার অ্যাপ্লিকেশনগুলিতে ব্যবহার করা সতর্ক হওয়া দরকার । সার্ভার অ্যাপ্লিকেশনগুলির জন্য জেভিএম খুব কমই প্রস্থান করবে। সুতরাং আপনার deleteOnExit()স্মৃতিশক্তি ফাঁস হওয়ার বিষয়ে সতর্ক হওয়া উচিত । জেভিএমকে প্রস্থান করতে গিয়ে মুছে ফেলা হওয়া সমস্ত ফাইলের ট্র্যাক রাখতে হবে যা জেভিএম সমাপ্ত হয় না।
রাজ্জলেরো

@ রাজ্জলেরো এটি দেখানোর জন্য ধন্যবাদ যে এটি কেবল জেভিএম প্রস্থানের পরে ফাইলগুলি মুছে ফেলে। তবে এটি মেমরি ফাঁস নয়, এটি নকশা অনুসারে কাজ করে।
andrej


1

কাস্ট যদি ইন্টারফেসের বর্গ দ্বারা বসন্তে tempfile অ্যাক্সেস করতে পারেন MultipartFileহয় CommonsMultipartFile

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;
    }

4
createNewFIle()এখানে অর্থহীন এবং অপব্যয় উভয়ই। আপনি এখন new FileOutputStream()উভয়কে (ওএসের মাধ্যমে) বাধ্যতামূলকভাবে তৈরি করা ফাইলটি মুছুন এবং একটি নতুন তৈরি করুন।
মার্নুইস অফ লর্ন

@ এজেপি হ্যাঁ, এটি অর্থহীন ছিল, এখন আমি সম্পাদনার সময় এই ভুলটি সংশোধন করি। তবে createNewFIle () অপব্যয় নয়, কারণ কমন্স মাল্ট্রিপার্টফাইলে যদি 10240 বাইটের চেয়ে কম হয়, ফাইল সিস্টেমে ফাইল তৈরি হয় না। সুতরাং যে কোনও অনন্য নামের (আমি ডিস্কফিল আইটেমটির নাম ব্যবহার করেছি) সহ একটি নতুন ফাইল এফএসে তৈরি করতে হবে।
Alex78191

@ অ্যালেক্স 78191 ডিস্ক ছোট ফাইলগুলিতে স্পষ্টতই সংরক্ষণ করার অর্থ আপনার (ডিফল্টরূপে <10240 বাইট)। সীমা বাড়াতে যাইহোক আছে কি
আনন্দ ঠাকুর

@ অ্যান্টটাগোর আমার অর্থ মাল্টিপার্টফাইলে 10240 বাইটের চেয়ে কম ফাইল সিস্টেমে সংরক্ষণ করছে না, সুতরাং ফাইলগুলি ম্যানুয়ালি তৈরি করা উচিত।
অ্যালেক্স 78191

0

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;
}

১০০৪০ বাইটের চেয়ে বেশি আকারের ফাইল আপলোড করার জন্য দয়া করে মাল্টিপার্টরেসলভারের সর্বোচ্চবিস্মরণীয় আকারটি 1 এমবিতে পরিবর্তন করুন।

<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>

maxInMemorySizeফাইল আপলোড আকারের সীমাবদ্ধতার সাথে কোনও সম্পর্ক নেই। ফাইল আপলোড আকার maxUploadSizeসম্পত্তি দ্বারা সেট করা হয় ।
অ্যালেক্স 78191

ফাইলগুলি দিয়ে কৌতুক থেকে মুক্তি পাওয়ার জন্য 10240 বাইটের চেয়ে কম maxInMemorySizeপ্রপ সেট করা যেতে পারে 0
অ্যালেক্স 78191

@ Alex78191 আমি এটি পরিবর্তন করেছি এবং এটি আমার পক্ষে কাজ করেছে। আমি ফাইলটি রূপান্তর করার জন্য আপনার কোডটি ব্যবহার করেছি। সুতরাং আমি মেমরির সীমাবদ্ধতাগুলি থেকে মুক্তি পেতে অ্যাপ্লিকেশনটিেক্সটেক্স.এমএমএলটিতে বৈশিষ্ট্যগুলি পরিবর্তন করেছি। এবং এটি কাজ করে !!!
আনন্দ ঠাকুর

মাল্টিপার্ট ফাইল থেকে একটি ফাইল তৈরি করার সময়, এটি মেমরিতে রাখা উচিত। সুতরাং এর জন্য আমাকে সর্বোচ্চবিস্তুত আকার বাড়িয়ে তুলতে হবে।
আনন্দ ঠাকুর

0

যদি আপনি MultipartFile.transferTo () ব্যবহার করতে না চান। আপনি এই মত ফাইল লিখতে পারেন

    val dir = File(filePackagePath)
    if (!dir.exists()) dir.mkdirs()

    val file = File("$filePackagePath${multipartFile.originalFilename}").apply {
        createNewFile()
    }

    FileOutputStream(file).use {
        it.write(multipartFile.bytes)
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.