জেএসপি / সার্লেট ব্যবহার করে কীভাবে সার্ভারে ফাইল আপলোড করবেন?


688

আমি কীভাবে জেএসপি / সার্লেট ব্যবহার করে সার্ভারে ফাইলগুলি আপলোড করতে পারি? আমি এটি চেষ্টা করেছি:

<form action="upload" method="post">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

তবে আমি কেবল ফাইলের নাম পাই, ফাইলের সামগ্রী নয় content আমি যোগ যখন enctype="multipart/form-data"থেকে <form>, তারপর request.getParameter()আয় null

গবেষণার সময় আমি অ্যাপাচি কমন ফাইল আপলোডকে হোঁচট খেয়েছি । আমি এটি চেষ্টা করেছি:

FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); // This line is where it died.

দুর্ভাগ্যক্রমে, সার্লেটটি একটি পরিষ্কার বার্তা এবং কারণ ছাড়াই একটি ব্যতিক্রম ছুঁড়ে দিয়েছে। এখানে স্ট্যাকট্রেস:

SEVERE: Servlet.service() for servlet UploadServlet threw exception
javax.servlet.ServletException: Servlet execution threw an exception
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:637)

সম্ভবত এই নিবন্ধটি সহায়ক হবে: baeldung.com/upload-file-servlet
অ্যাডাম জেরার্ড

উত্তর:


1193

ভূমিকা

ব্রাউজ করতে এবং আপলোডের জন্য একটি ফাইল নির্বাচন করতে আপনাকে <input type="file">ফর্মটিতে একটি HTML ক্ষেত্র প্রয়োজন । এইচটিএমএল স্পেসিফিকেশনে বর্ণিত হিসাবে আপনাকে POSTপদ্ধতিটি ব্যবহার enctypeকরতে হবে এবং ফর্মটির বৈশিষ্ট্যটি সেট করতে হবে "multipart/form-data"

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

এই জাতীয় ফর্ম জমা দেওয়ার পরে, বাইনারি মাল্টিপার্ট ফর্ম ডেটা অনুরোধের বডিটিতে একটি ভিন্ন ফর্ম্যাটে উপলব্ধenctype সেট না থাকা চেয়ে ।

সার্লেলেট 3.0.০ এর আগে সার্ভলেট এপিআই স্থানীয়ভাবে সমর্থন করে নি multipart/form-data। এটি কেবলমাত্র ডিফল্ট ফর্ম এনকটাইপ সমর্থন করে application/x-www-form-urlencodedrequest.getParameter()এবং স্ত্রীদেরকে সব ফিরে আসবে nullযখন একাধিক ফর্ম তথ্য ব্যবহার করে। এখানেই সুপরিচিত অ্যাপাচি কমন্স ফাইলআপলোড ছবিতে এসেছিল।

ম্যানুয়ালি এটি বিশ্লেষণ করবেন না!

আপনি তত্ত্বগতভাবে অনুরোধের বডিটি নিজের উপর ভিত্তি করে বিশ্লেষণ করতে পারেন ServletRequest#getInputStream()। তবে এটি একটি সুনির্দিষ্ট এবং ক্লান্তিকর কাজ যার জন্য আরএফসি 2388 সম্পর্কে সুনির্দিষ্ট জ্ঞানের প্রয়োজন । আপনার নিজের এটি করার চেষ্টা করা উচিত নয় বা ইন্টারনেটে অন্য কোথাও পাওয়া কিছু হোমগ্রাউন লাইব্রেরি-কম কোড কপিপেষ্ট করা উচিত নয়। অনেকগুলি অনলাইন উত্স এতে সফলভাবে ব্যর্থ হয়েছে, যেমন রোজিন্ডিয়া ডটনেট। আরো দেখুনপিডিএফ ফাইল আপলোডও । আপনার বরং সত্যিকারের একটি লাইব্রেরি ব্যবহার করা উচিত যা কয়েক বছর ধরে কয়েক মিলিয়ন ব্যবহারকারীর দ্বারা ব্যবহৃত হয় (এবং স্পষ্টভাবে পরীক্ষিত!)। এই জাতীয় গ্রন্থাগারটি তার দৃust়তা প্রমাণ করেছে।

আপনি ইতিমধ্যে সার্লেট ৩.০ বা আরও নতুনতে থাকলে নেটিভ API ব্যবহার করুন

যদি আপনি কমপক্ষে servlet 3.0 (টমক্যাট 7, জেটি 9, জবস এএস 6, গ্লাস ফিশ 3, ইত্যাদি) ব্যবহার করে থাকেন তবে HttpServletRequest#getPart()স্বতন্ত্র মাল্টিপার্ট ফর্ম ডেটা আইটেম সংগ্রহ করার জন্য আপনি সরবরাহকৃত স্ট্যান্ডার্ড এপিআই ব্যবহার করতে পারেন (বেশিরভাগ সার্লেলেট 3.0 বাস্তবায়নগুলি অ্যাপাচি ব্যবহার করে এই জন্য কভারস কমন্স ফাইল আপলোড!)। এছাড়াও, সাধারণ ফর্ম ক্ষেত্রগুলি দ্বারা উপলব্ধgetParameter() সাধারণ উপায়ে উপলব্ধ।

প্রথমে আপনার সার্লেলেটটিকে @MultipartConfigএটির multipart/form-dataঅনুরোধগুলি সনাক্ত এবং সমর্থন করার জন্য এনেটেট করুন এবং এভাবে getPart()কাজ শুরু করুন:

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    // ...
}

তারপরে, এটি doPost()নিম্নলিখিত হিসাবে বাস্তবায়ন করুন :

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String description = request.getParameter("description"); // Retrieves <input type="text" name="description">
    Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
    InputStream fileContent = filePart.getInputStream();
    // ... (do your job here)
}

নোট করুন Path#getFileName() । ফাইলের নাম পাওয়ার ক্ষেত্রে এটি একটি এমএসআইই ফিক্স। এই ব্রাউজারটি ভুলভাবে কেবল ফাইল নামের পরিবর্তে নামের সাথে পুরো ফাইল পাঠায়।

আপনার যদি <input type="file" name="file" multiple="true" />মাল্টি-ফাইল আপলোডের জন্য থাকে তবে সেগুলি নীচে হিসাবে সংগ্রহ করুন (দুর্ভাগ্যক্রমে এমন কোনও পদ্ধতি নেই request.getParts("file")):

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
    List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName()) && part.getSize() > 0).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true">

    for (Part filePart : fileParts) {
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
        InputStream fileContent = filePart.getInputStream();
        // ... (do your job here)
    }
}

আপনি যখন সার্লেট ৩.১ এ নেই, ম্যানুয়ালি ফাইলের নাম জমা দিন

Part#getSubmittedFileName()টীকাট 8, জেটি 9, ওয়াইল্ডফ্লাই 8, গ্লাস ফিশ 4 ইত্যাদি সার্ভলেট 3.1-এ প্রবর্তিত হয়েছে তা নোট করুন । আপনি যদি এখনও সার্লেট ৩.১ এ নেই তবে জমা দেওয়া ফাইলের নামটি পেতে আপনার অতিরিক্ত ইউটিলিটি পদ্ধতি প্রয়োজন need

private static String getSubmittedFileName(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
        if (cd.trim().startsWith("filename")) {
            String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
            return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
        }
    }
    return null;
}
String fileName = getSubmittedFileName(filePart);

ফাইলের নাম পাওয়ার ক্ষেত্রে এমএসআইই ফিক্সটি নোট করুন। এই ব্রাউজারটি ভুলভাবে কেবল ফাইল নামের পরিবর্তে নামের সাথে পুরো ফাইল পাঠায়।

আপনি এখনও সার্লেট ৩.০-তে নেই, তখন অ্যাপাচি কমন্স ফাইলআপলোড ব্যবহার করুন

আপনি যদি এখনও সার্লেট ৩.০-তে নেই (এটি আপগ্রেড হওয়ার সময় সম্পর্কে নয়?), সাধারণ অনুশীলনটি হ'ল মাল্টিপার্ট ফর্ম ডেটা অনুরোধগুলি পার্স করার জন্য অ্যাপাচি কমন্স ফাইলআপলোড ব্যবহার করা । এটিতে একটি দুর্দান্ত ইউজার গাইড এবং এফএকিউ রয়েছে (সাবধানে উভয়টি দিয়ে যান)। ও'রিলি (" কোস " )ও রয়েছেMultipartRequest , তবে এটিতে কিছু (গৌণ) বাগ রয়েছে এবং কয়েক বছর ধরে সক্রিয়ভাবে আর রক্ষণাবেক্ষণ করা হচ্ছে না। আমি এটি ব্যবহার করার পরামর্শ দেব না। অ্যাপাচি কমন্স ফাইলআপলোড এখনও সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয় এবং বর্তমানে খুব পরিপক্ক।

অ্যাপাচি কমন্স ফাইলআপলোড ব্যবহার করতে আপনার ওয়েব অ্যাপ্লিকেশনগুলিতে কমপক্ষে নিম্নলিখিত ফাইল থাকা দরকার /WEB-INF/lib:

আপনার প্রাথমিক প্রচেষ্টাটি সম্ভবত ব্যর্থ হয়েছে কারণ আপনি কমন্স আইওকে ভুলে গেছেন।

অ্যাপাচি কমন্স ফাইলআপলোড ব্যবহার করার doPost()সময় আপনার UploadServletচেহারাটি কেমন দেখতে পারে তা এখানে একটি উদাহরণ :

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (item.isFormField()) {
                // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                String fieldName = item.getFieldName();
                String fieldValue = item.getString();
                // ... (do your job here)
            } else {
                // Process form file field (input type="file").
                String fieldName = item.getFieldName();
                String fileName = FilenameUtils.getName(item.getName());
                InputStream fileContent = item.getInputStream();
                // ... (do your job here)
            }
        }
    } catch (FileUploadException e) {
        throw new ServletException("Cannot parse multipart request.", e);
    }

    // ...
}

এটা খুবই গুরুত্বপূর্ণ যে আপনি কল করি না getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader()একই অনুরোধ পূর্বেই উপর ইত্যাদি। অন্যথায় সার্লেট কন্টেইনারটি অনুরোধের বডিটি পড়বে এবং পার্স করবে এবং এভাবে অ্যাপাচি কমন্স ফাইলআপলোড একটি খালি অনুরোধের বডি পাবে। আরও দেখুন সার্ভলেট ফাইল আপলোড # পার্সেরউয়েস্ট (অনুরোধ) খালি তালিকা দেয়

নোট করুনFilenameUtils#getName() । ফাইলের নাম পাওয়ার ক্ষেত্রে এটি একটি এমএসআইই ফিক্স। এই ব্রাউজারটি ভুলভাবে কেবল ফাইল নামের পরিবর্তে নামের সাথে পুরো ফাইল পাঠায়।

বিকল্পভাবে আপনি Filterএগুলি সমস্ত এমনভাবে গুটিয়ে রাখতে পারেন যা এটি স্বয়ংক্রিয়ভাবে পার্স করে এবং স্টাফটিকে অনুরোধের প্যারামিটার্যাপে ফিরিয়ে দেয় যাতে আপনি request.getParameter()স্বাভাবিক পদ্ধতিতে চালিয়ে যেতে পারেন এবং আপলোড করা ফাইলটি পুনরুদ্ধার করতে পারেন request.getAttribute()আপনি এই ব্লগ নিবন্ধে একটি উদাহরণ খুঁজে পেতে পারেন

গ্লাস ফিশ 3 বাগটি getParameter()এখনও ফিরছে Worknull

নোট করুন যে 3.1.2 এর চেয়ে পুরানো গ্লাসফিশ সংস্করণগুলিতে একটি বাগ রয়েছে যার মধ্যে getParameter()এখনও ফিরে আসে null। আপনি যদি এই জাতীয় পাত্রে লক্ষ্য করে থাকেন এবং এটিকে আপগ্রেড করতে না পারেন তবে আপনাকে getPart()এই ইউটিলিটি পদ্ধতির সাহায্যে মানটি বের করতে হবে :

private static String getValue(Part part) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8"));
    StringBuilder value = new StringBuilder();
    char[] buffer = new char[1024];
    for (int length = 0; (length = reader.read(buffer)) > 0;) {
        value.append(buffer, 0, length);
    }
    return value.toString();
}
String description = getValue(request.getPart("description")); // Retrieves <input type="text" name="description">

আপলোড করা ফাইল সংরক্ষণ করা হচ্ছে (ব্যবহার করবেন getRealPath()না part.write()!)

প্রাপ্ত InputStream(( fileContentউপরের কোড স্নিপেটগুলিতে প্রদর্শিত ভেরিয়েবলটি) ডিস্ক বা ডাটাবেসে সঠিকভাবে সংরক্ষণ করার জন্য নীচের উত্তরের দিকে যান:

আপলোড করা ফাইল পরিবেশন করা হচ্ছে

ডিস্ক বা ডাটাবেস থেকে ক্লায়েন্টকে ফিরিয়ে দেওয়া সংরক্ষিত ফাইলটি সঠিকভাবে পরিবেশন করার বিষয়ে বিশদে নীচের উত্তরের দিকে যান:

ফর্মটি আজাক্সফায় করছে

Ajax (এবং jQuery) ব্যবহার করে কীভাবে আপলোড করবেন তা নিম্নলিখিত উত্তরগুলিতে যান। মনে রাখবেন যে ফর্ম ডেটা সংগ্রহ করার জন্য সার্লেট কোডটির জন্য এই পরিবর্তন করার দরকার নেই! আপনি যেভাবে প্রতিক্রিয়া দেখিয়েছেন সেভাবেই কেবল পরিবর্তন করা যেতে পারে তবে এটি বরং তুচ্ছ (অর্থাত্ জেএসপিতে ফরোয়ার্ড না করে, কেবল কিছু জেএসএন বা এক্সএমএল প্রিন্ট করুন বা এমনকি সরল পাঠ্য যা অ্যাজাক্স কলটির জন্য দায়ী স্ক্রিপ্টটি প্রত্যাশা করছে তার উপর নির্ভর করে) print


আশা করি এই সব সাহায্য করে :)


আহা দুঃখিত, আমি request.getParts("file")দেখছিলাম এবং বিভ্রান্ত হয়ে পড়েছিলাম x_x
কাগামী স্যাসা রোজলাইট

সার্লেট ৩.০ সহ, যদি কোনও MultipartConfigশর্ত লঙ্ঘিত হয় (যেমন maxFileSize:), কলগুলি request.getParameter()রিটার্ন বাতিল করে। এটা কি উদ্দেশ্য নিয়ে? যদি আমি কল করার আগে কিছু নিয়মিত (পাঠ্য) পরামিতি পাই getPart(এবং এটির জন্য পরীক্ষা করছি IllegalStateException) তবে কী হবে? এই কারণ NullPointerExceptionআগে আমি পরীক্ষা করার জন্য একটি সুযোগ আছে নিক্ষিপ্ত হবে IllegalStateException
theyuv

@ বালুসসি আমি এই সম্পর্কিত একটি পোস্ট তৈরি করেছি, আপনার কী ধারণা আছে যে আমি কীভাবে ফাইল এপিআই ওয়েবকিটডাইরেক্টরি থেকে অতিরিক্ত ইনফোগুলি উদ্ধার করতে পারি? আরো বিস্তারিত এখানে stackoverflow.com/questions/45419598/...
Rapster

আপনি সার্ভলেট 3.0 এ না থাকলে এবং ফাইল আপলোড ট্রিকটি ব্যবহার না করে, আমি দেখেছি আপনি অনুরোধটি থেকে একাধিকবার ফাইলটি পড়তে পারবেন না। আপনার যদি এই কার্যকারিতাটির প্রয়োজন হয় তবে আপনি স্প্রিংয়ের মাল্টিপার্টফিল্টারটি দেখতে চাইতে পারেন। : এই পোস্টটি আমাদের কাজের একটি ভালো উদাহরণ রয়েছে stackoverflow.com/a/21448087/1048376
splashout

1
হ্যাঁ, কেউ যদি টমক্যাট with দিয়ে 3.0.০ বিভাগে কোডটি ব্যবহার করার চেষ্টা করে তবে তারা String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.আমার মতো অংশে সমস্যার মুখোমুখি হতে পারে
রাভিরাজা

26

যদি আপনি স্প্রিং এমভিসি ব্যবহার করে থাকেন তবে এইভাবে করা যায়: (কেউ এটির কাজে লাগলে আমি এটি এখানে রেখে যাচ্ছি)।

enctype" multipart/form-data" এ অ্যাট্রিবিউট সেট সহ একটি ফর্ম ব্যবহার করুন (বালুসকের উত্তর হিসাবে একই)

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="Upload"/>
</form>

আপনার নিয়ামক মধ্যে, অনুরোধ পরামিতি মানচিত্র fileথেকে MultipartFileটাইপ নিম্নরূপ:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void handleUpload(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
            byte[] bytes = file.getBytes(); // alternatively, file.getInputStream();
            // application logic
    }
}

আপনি ফাইলের নাম এবং আকার ব্যবহার করে পেতে পারেন MultipartFile'র getOriginalFilename()এবং getSize()

আমি এটি স্প্রিং সংস্করণ দিয়ে পরীক্ষা করেছি 4.1.1.RELEASE


যদি আমার ভুল না হয় তবে এটির জন্য আপনার সার্ভারের অ্যাপ্লিকেশন কনফিগারেশনে শিমটি কনফিগার করা দরকার ...
কেনি ওয়ার্ডেন

11

আপনার common-io.1.4.jarফাইলটি আপনার libডিরেক্টরিতে অন্তর্ভুক্ত করা দরকার , অথবা আপনি যদি নেটবিন্সের মতো কোনও সম্পাদকে কাজ করছেন, তবে আপনাকে প্রকল্পের বৈশিষ্ট্যগুলিতে যেতে হবে এবং কেবল জেআর ফাইল যুক্ত করতে হবে এবং আপনার কাজ শেষ হবে।

common.io.jarফাইলটি পেতে কেবল এটি গুগল করুন বা কেবল অ্যাপাচি টমক্যাট ওয়েবসাইটে যান যেখানে আপনি এই ফাইলটির নিখরচায় ডাউনলোডের বিকল্প পাবেন। তবে একটি জিনিস মনে রাখবেন: আপনি যদি উইন্ডোজ ব্যবহারকারী হন তবে বাইনারি জিপ ফাইলটি ডাউনলোড করুন।


খুঁজে পাচ্ছি না .jarকিন্তু .zip। মানে .zip?
মালভিন্দর সিং

10

টমক্যাট 6 বা 7 এর উপাদান বা বাহ্যিক গ্রন্থাগার ছাড়াই

ওয়েব.এক্সএমএল ফাইলটিতে আপলোড সক্ষম করা :

http://joseluisbz.wordpress.com/2014/01/17/manally-installing-php-tomcat-and-httpd-lounge/#Enabling%20File%20Uploads

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

আপনি দেখতে পাচ্ছেন :

    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>

জেএসপি ব্যবহার করে ফাইল আপলোড করা হচ্ছে। নথি পত্র:

এইচটিএমএল ফাইলে

<form method="post" enctype="multipart/form-data" name="Form" >

  <input type="file" name="fFoto" id="fFoto" value="" /></td>
  <input type="file" name="fResumen" id="fResumen" value=""/>

জেএসপি ফাইল বা সার্লেলে

    InputStream isFoto = request.getPart("fFoto").getInputStream();
    InputStream isResu = request.getPart("fResumen").getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte buf[] = new byte[8192];
    int qt = 0;
    while ((qt = isResu.read(buf)) != -1) {
      baos.write(buf, 0, qt);
    }
    String sResumen = baos.toString();

সর্বোচ্চ কোড ফাইলের আকার , সর্বাধিক অনুরোধের আকার এবং আপনি সেট করতে পারেন এমন অন্যান্য বিকল্পগুলির মতো আপনার কোডটি সার্লেট প্রয়োজনে সম্পাদনা করুন ...


9

আমি প্রতিটি এইচটিএমএল ফর্মের সাথে সংযুক্তি আছে কিনা তা ব্যবহার করার জন্য সাধারণ সার্লেট ব্যবহার করছি । এই সার্লেটটি এমন এক TreeMapজায়গায় ফিরে আসে যেখানে কীগুলি jsp নামের প্যারামিটার এবং মানগুলি হ'ল ব্যবহারকারী ইনপুট এবং নির্দিষ্ট সংযুক্তিতে সমস্ত সংযুক্তি সংরক্ষণ করে এবং পরে আপনি আপনার পছন্দের ডিরেক্টরিটির নাম পরিবর্তন করেন e এখানে সংযোগগুলি আমাদের কাস্টম ইন্টারফেসটি সংযোগ অবজেক্টযুক্ত। আমি মনে করি এটি আপনাকে সাহায্য করবে

public class ServletCommonfunctions extends HttpServlet implements
        Connections {

    private static final long serialVersionUID = 1L;

    public ServletCommonfunctions() {}

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException {}

    public SortedMap<String, String> savefilesindirectory(
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // Map<String, String> key_values = Collections.synchronizedMap( new
        // TreeMap<String, String>());
        SortedMap<String, String> key_values = new TreeMap<String, String>();
        String dist = null, fact = null;
        PrintWriter out = response.getWriter();
        File file;
        String filePath = "E:\\FSPATH1\\2KL06CS048\\";
        System.out.println("Directory Created   ????????????"
            + new File(filePath).mkdir());
        int maxFileSize = 5000 * 1024;
        int maxMemSize = 5000 * 1024;
        // Verify the content type
        String contentType = request.getContentType();
        if ((contentType.indexOf("multipart/form-data") >= 0)) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // maximum size that will be stored in memory
            factory.setSizeThreshold(maxMemSize);
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File(filePath));
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            // maximum file size to be uploaded.
            upload.setSizeMax(maxFileSize);
            try {
                // Parse the request to get file items.
                @SuppressWarnings("unchecked")
                List<FileItem> fileItems = upload.parseRequest(request);
                // Process the uploaded file items
                Iterator<FileItem> i = fileItems.iterator();
                while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (!fi.isFormField()) {
                        // Get the uploaded file parameters
                        String fileName = fi.getName();
                        // Write the file
                        if (fileName.lastIndexOf("\\") >= 0) {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\")));
                        } else {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\") + 1));
                        }
                        fi.write(file);
                    } else {
                        key_values.put(fi.getFieldName(), fi.getString());
                    }
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
        return key_values;
    }
}

@ ভেবে সিন্ডি ওহে ফাইলপ্যাথটি কী হওয়া উচিত যদি আমি লাইভ সার্ভার ব্যবহার করি বা আমি সার্ভারে ফাইলগুলি আপলোড করে আমার প্রকল্পটি বেঁচে থাকি
আমানস

2
লাইভ সার্ভারে যে কোনও ডিরেক্টরি। আপনি সার্লেলে একটি ডিরেক্টরি তৈরি করতে একটি কোড লিখেন তবে ডিরেক্টরিটি সরাসরি সম্প্রচারে তৈরি করা হবে
ভাল লাগবে এবং প্রোগ্রামিং করুন

8

স্প্রিং এমভিসি-র জন্য আমি কয়েক ঘন্টার জন্য এটি চেষ্টা করে চলেছি এবং এটির একটি সহজ সংস্করণ পরিচালনা করতে পেরেছি যা ডেটা এবং চিত্র উভয়ই ফর্ম ইনপুট নেওয়ার জন্য কাজ করেছে।

<form action="/handleform" method="post" enctype="multipart/form-data">
  <input type="text" name="name" />
  <input type="text" name="age" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

পরিচালনা করতে নিয়ন্ত্রক

@Controller
public class FormController {
    @RequestMapping(value="/handleform",method= RequestMethod.POST)
    ModelAndView register(@RequestParam String name, @RequestParam int age, @RequestParam MultipartFile file)
            throws ServletException, IOException {

        System.out.println(name);
        System.out.println(age);
        if(!file.isEmpty()){
            byte[] bytes = file.getBytes();
            String filename = file.getOriginalFilename();
            BufferedOutputStream stream =new BufferedOutputStream(new FileOutputStream(new File("D:/" + filename)));
            stream.write(bytes);
            stream.flush();
            stream.close();
        }
        return new ModelAndView("index");
    }
}

আশা করি এটা সাহায্য করবে :)


আপনি কি দয়া করে নির্বাচিত চিত্র ফর্মটি ডিবি মাইএসকিএল ভাগ করে জেএসপি / এইচটিএমএল এ প্রদর্শন করতে পারেন?
বেদ প্রকাশ

6

আপনি যদি জেরোনিমো এর এমবেডড টমকেট ব্যবহার করে থাকেন তবে এই সমস্যার আর একটি উত্স দেখা দেয়। এই ক্ষেত্রে, কমন্স-আইও এবং কমন্স-ফাইলআপলোড পরীক্ষার অনেকগুলি পুনরাবৃত্তির পরে, কমেন্টস-এক্সএক্সএক্স জারগুলি পরিচালনা করে কোনও পিতামাতার ক্লাস লোডার থেকেই সমস্যা দেখা দেয়। এটি রোধ করতে হবে। ক্রাশটি সর্বদা এখানে ঘটে:

fileItems = uploader.parseRequest(request);

নোট করুন যে ফাইল আইটেমের তালিকার ধরণটি কমার্স-ফাইলআপলোডের বর্তমান সংস্করণটির সাথে পরিবর্তিত হয়েছে List<FileItem>যেখানে এটি সাধারণ ছিল যেখানে পূর্ববর্তী সংস্করণগুলির থেকে বিপরীতে ছিল List

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

অবশেষে, আমি 1 টি জায়গা খুঁজে পেয়েছি যা একটি কার্যনির্বাহী সমস্যা সমাধান করেছিল যা আমার সমস্যাটিকে সফলভাবে সমাধান করেছে। আপনাকে অবশ্যই পরিকল্পনা পরিকল্পনায় পাত্রগুলি প্যারেন্ট লোডার থেকে আড়াল করতে হবে। এটি নীচে দেখানো আমার সম্পূর্ণ ফাইল সহ geronimo-web.xML এ রাখা হয়েছিল।

Pasted from <http://osdir.com/ml/user-geronimo-apache/2011-03/msg00026.html> 



<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web:web-app xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
    <dep:environment>
        <dep:moduleId>
            <dep:groupId>DataStar</dep:groupId>
            <dep:artifactId>DataStar</dep:artifactId>
            <dep:version>1.0</dep:version>
            <dep:type>car</dep:type>
        </dep:moduleId>

<!--Don't load commons-io or fileupload from parent classloaders-->
        <dep:hidden-classes>
            <dep:filter>org.apache.commons.io</dep:filter>
            <dep:filter>org.apache.commons.fileupload</dep:filter>
        </dep:hidden-classes>
        <dep:inverse-classloading/>        


    </dep:environment>
    <web:context-root>/DataStar</web:context-root>
</web:web-app>

0

অ্যাপাচি কমন্স-ফাইলআপলোড ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হয়েছে:

// apache commons-fileupload to handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(DataSources.TORRENTS_DIR()));
ServletFileUpload fileUpload = new ServletFileUpload(factory);

List<FileItem> items = fileUpload.parseRequest(req.raw());
FileItem item = items.stream()
  .filter(e ->
  "the_upload_name".equals(e.getFieldName()))
  .findFirst().get();
String fileName = item.getName();

item.write(new File(dir, fileName));
log.info(fileName);

0

সবচেয়ে সহজ উপায় ফাইল এবং ইনপুট নিয়ন্ত্রণগুলির সাথে আসতে পারে, এক বিলিয়ন লাইব্রেরি ডাব্লু / আউট:

  <%
  if (request.getContentType()==null) return;
  // for input type=text controls
  String v_Text = 
  (new BufferedReader(new InputStreamReader(request.getPart("Text1").getInputStream()))).readLine();    

  // for input type=file controls
  InputStream inStr = request.getPart("File1").getInputStream();
  char charArray[] = new char[inStr.available()];
  new InputStreamReader(inStr).read(charArray);
  String contents = new String(charArray);
  %>

-1

আপনি jsp / servlet ব্যবহার করে ফাইল আপলোড করতে পারেন।

<form action="UploadFileServlet" method="post">
  <input type="text" name="description" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

অন্যদিকে সার্ভার সাইডে। নিম্নলিখিত কোড ব্যবহার করুন।

     package com.abc..servlet;

import java.io.File;
---------
--------


/**
 * Servlet implementation class UploadFileServlet
 */
public class UploadFileServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public UploadFileServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.sendRedirect("../jsp/ErrorPage.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

            PrintWriter out = response.getWriter();
            HttpSession httpSession = request.getSession();
            String filePathUpload = (String) httpSession.getAttribute("path")!=null ? httpSession.getAttribute("path").toString() : "" ;

            String path1 =  filePathUpload;
            String filename = null;
            File path = null;
            FileItem item=null;


            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                String FieldName = "";
                try {
                    List items = upload.parseRequest(request);
                    Iterator iterator = items.iterator();
                    while (iterator.hasNext()) {
                         item = (FileItem) iterator.next();

                            if (fieldname.equals("description")) {
                                description = item.getString();
                            }
                        }
                        if (!item.isFormField()) {
                            filename = item.getName();
                            path = new File(path1 + File.separator);
                            if (!path.exists()) {
                                boolean status = path.mkdirs();
                            }
                            /* START OF CODE FRO PRIVILEDGE*/

                            File uploadedFile = new File(path + Filename);  // for copy file
                            item.write(uploadedFile);
                            }
                        } else {
                            f1 = item.getName();
                        }

                    } // END OF WHILE 
                    response.sendRedirect("welcome.jsp");
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }   
    }

}

-1
DiskFileUpload upload=new DiskFileUpload();

এই অবজেক্ট থেকে আপনাকে ফাইল আইটেম এবং ক্ষেত্রগুলি পেতে হবে তারপরে আপনি অনুসরণের মতো সার্ভারে স্টোর করতে পারবেন:

String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);

-2

ফাইলের জন্য একাধিক ফাইল প্রেরণ করা আমাদের ইনপুট ট্যাগে enctype="multipart/form-data"
ব্যবহার করতে এবং একাধিক ফাইল প্রেরণ করতে multiple="multiple"হয়

<form action="upload" method="post" enctype="multipart/form-data">
 <input type="file" name="fileattachments"  multiple="multiple"/>
 <input type="submit" />
</form>

2
আমরা কীভাবে getPart ("ফাইলট্যাচমেন্টস") করতে যাব যাতে আমরা তার পরিবর্তে অংশগুলির একটি অ্যারে পাই? আমি মনে করি না একাধিক ফাইলের জন্য getPart কাজ করবে?
সাইবারমিউ

-2

এইচটিএমএল পৃষ্ঠা

<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="UploadServlet" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html> 

সার্ভলেট ফাইল

// Import required java libraries
import java.io.*;
import java.util.*;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {

   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = 
             getServletContext().getInitParameter("file-upload"); 
   }
   public void doPost(HttpServletRequest request, 
               HttpServletResponse response)
              throws ServletException, java.io.IOException {
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      if( !isMultipart ){
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try{ 
      // Parse the request to get file items.
      List fileItems = upload.parseRequest(request);

      // Process the uploaded file items
      Iterator i = fileItems.iterator();

      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      while ( i.hasNext () ) 
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {
            // Get the uploaded file parameters
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            // Write the file
            if( fileName.lastIndexOf("\\") >= 0 ){
               file = new File( filePath + 
               fileName.substring( fileName.lastIndexOf("\\"))) ;
            }else{
               file = new File( filePath + 
               fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;
            out.println("Uploaded Filename: " + fileName + "<br>");
         }
      }
      out.println("</body>");
      out.println("</html>");
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }
   public void doGet(HttpServletRequest request, 
                       HttpServletResponse response)
        throws ServletException, java.io.IOException {

        throw new ServletException("GET method used with " +
                getClass( ).getName( )+": POST method required.");
   } 
}

web.xml

সার্ভলেট আপলোড সার্ভেলের উপরে সংকলন করুন এবং নিম্নলিখিতভাবে ওয়েব.এক্সএমএল ফাইলে প্রয়োজনীয় এন্ট্রি তৈরি করুন।

<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.