Làm cách nào để tải tệp lên máy chủ bằng cách sử dụng JSP / Servlet?


688

Làm cách nào tôi có thể tải tệp lên máy chủ bằng cách sử dụng JSP / Servlet? Tôi đã thử điều này:

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

Tuy nhiên, tôi chỉ nhận được tên tệp chứ không phải nội dung tệp. Khi tôi thêm enctype="multipart/form-data"vào <form>, sau đó request.getParameter()trở lại null.

Trong quá trình nghiên cứu, tôi tình cờ thấy Apache FileUpload . Tôi đã thử điều này:

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

Thật không may, servlet đã ném một ngoại lệ mà không có thông điệp và nguyên nhân rõ ràng. Đây là stacktrace:

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)

Có lẽ bài viết này sẽ hữu ích: baeldung.com/upload-file-servlet
Adam Gerard

Câu trả lời:


1193

Giới thiệu

Để duyệt và chọn tệp để tải lên, bạn cần có <input type="file">trường HTML trong biểu mẫu. Như đã nêu trong đặc tả HTML, bạn phải sử dụng POSTphương thức và enctypethuộc tính của biểu mẫu phải được đặt thành "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>

Sau khi gửi biểu mẫu như vậy, dữ liệu biểu mẫu nhiều phần nhị phân có sẵn trong phần yêu cầu ở định dạng khác với khi enctypekhông được đặt.

Trước Servlet 3.0, API Servlet thực sự không hỗ trợ multipart/form-data. Nó chỉ hỗ trợ các kiểu mã mặc định của application/x-www-form-urlencoded. Các request.getParameter()và các phu nhân sẽ trở lại tất cả nullkhi sử dụng dữ liệu mẫu nhiều phần dữ liệu. Đây là nơi mà FileUpload nổi tiếng của Apache được đưa vào hình ảnh.

Đừng tự phân tích nó!

Về lý thuyết, bạn có thể phân tích cơ thể yêu cầu dựa trên ServletRequest#getInputStream(). Tuy nhiên, đây là một công việc chính xác và tẻ nhạt đòi hỏi kiến ​​thức chính xác về RFC2388 . Bạn không nên cố gắng tự làm điều này hoặc sao chép một số mã không có thư viện tại nhà được tìm thấy ở nơi khác trên Internet. Nhiều nguồn trực tuyến đã thất bại nặng nề trong việc này, chẳng hạn như roseindia.net. Xem thêm tải lên tập tin pdf . Bạn nên sử dụng một thư viện thực sự được sử dụng (và được kiểm tra ngầm!) Bởi hàng triệu người dùng trong nhiều năm. Một thư viện như vậy đã chứng minh sự mạnh mẽ của nó.

Khi bạn đã sử dụng Servlet 3.0 trở lên, hãy sử dụng API gốc

Nếu bạn đang sử dụng ít nhất Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3, v.v.), thì bạn chỉ có thể sử dụng API tiêu chuẩn được cung cấp HttpServletRequest#getPart()để thu thập các mục dữ liệu biểu mẫu nhiều phần riêng lẻ (hầu hết các triển khai Servlet 3.0 thực sự sử dụng Apache Commons FileUpload dưới vỏ bọc cho việc này!). Ngoài ra, các trường mẫu thông thường có sẵn theo cách getParameter()thông thường.

Đầu tiên chú thích servlet của bạn với @MultipartConfigđể cho phép nó nhận ra và hỗ trợ multipart/form-datacác yêu cầu và do đó bắt getPart()đầu hoạt động:

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

Sau đó, thực hiện doPost()như sau:

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

Lưu ý Path#getFileName(). Đây là một sửa chữa MSIE để có được tên tệp. Trình duyệt này gửi không chính xác đường dẫn tệp đầy đủ dọc theo tên thay vì chỉ tên tệp.

Trong trường hợp bạn có <input type="file" name="file" multiple="true" />tải lên nhiều tệp, hãy thu thập chúng như dưới đây (không may là không có phương pháp nào như 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)
    }
}

Khi bạn chưa có trên Servlet 3.1, hãy lấy tên tệp đã gửi theo cách thủ công

Lưu ý rằng Part#getSubmittedFileName()đã được giới thiệu trong Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4, v.v.). Nếu bạn chưa có trên Servlet 3.1, thì bạn cần một phương thức tiện ích bổ sung để có được tên tệp đã gửi.

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

Lưu ý sửa lỗi MSIE để lấy tên tệp. Trình duyệt này gửi không chính xác đường dẫn tệp đầy đủ dọc theo tên thay vì chỉ tên tệp.

Khi bạn chưa có trên Servlet 3.0, hãy sử dụng Apache Commons FileUpload

Nếu bạn chưa có trên Servlet 3.0 (chưa đến lúc phải nâng cấp?), Thói quen phổ biến là sử dụng Apache Commons FileUpload để phân tích các yêu cầu dữ liệu dạng nhiều phần. Nó có Hướng dẫn sử dụngCâu hỏi thường gặp tuyệt vời (cẩn thận thực hiện cả hai). Ngoài ra còn có O'Reilly (" cos ") MultipartRequest, nhưng nó có một số lỗi (nhỏ) và không được duy trì tích cực trong nhiều năm. Tôi không khuyên bạn nên sử dụng nó. Apache Commons FileUpload vẫn được duy trì tích cực và hiện đang rất trưởng thành.

Để sử dụng Apache Commons FileUpload, bạn cần có ít nhất các tệp sau trong ứng dụng web của mình /WEB-INF/lib:

Nỗ lực ban đầu của bạn thất bại rất có thể vì bạn đã quên IO chung.

Đây là một ví dụ khởi đầu về cách doPost()bạn UploadServletcó thể trông như thế nào khi sử dụng Apache Commons FileUpload:

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

    // ...
}

Nó rất quan trọng là bạn không gọi getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), vv trên cùng một yêu cầu trước đó. Mặt khác, thùng chứa servlet sẽ đọc và phân tích phần thân yêu cầu và do đó Apache Commons FileUpload sẽ nhận được phần thân yêu cầu trống. Xem thêm ao ServletFileUpload # parseRequest (request) trả về một danh sách trống .

Lưu ý FilenameUtils#getName(). Đây là một sửa chữa MSIE để có được tên tệp. Trình duyệt này gửi không chính xác đường dẫn tệp đầy đủ dọc theo tên thay vì chỉ tên tệp.

Ngoài ra, bạn cũng có thể gói tất cả những thứ này trong Filterđó phân tích tất cả một cách tự động và đưa nội dung trở lại vào parametermap của yêu cầu để bạn có thể tiếp tục sử dụng cách request.getParameter()thông thường và truy xuất tệp đã tải lên bằng cách request.getAttribute(). Bạn có thể tìm thấy một ví dụ trong bài viết blog này .

Giải pháp cho lỗi GlassFish3 getParameter()vẫn quay trở lạinull

Lưu ý rằng các phiên bản Glassfish cũ hơn 3.1.2 có lỗi trong đó getParameter()vẫn trả về null. Nếu bạn đang nhắm mục tiêu một thùng chứa như vậy và không thể nâng cấp nó, thì bạn cần trích xuất giá trị từ getPart()sự trợ giúp của phương pháp tiện ích này:

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

Lưu tệp đã tải lên (không sử dụng getRealPath()cũng không part.write()!)

Đi đến các câu trả lời sau để biết chi tiết về cách lưu chính xác InputStream( fileContentbiến như được hiển thị trong đoạn mã trên) vào đĩa hoặc cơ sở dữ liệu:

Phục vụ tập tin tải lên

Đi đến các câu trả lời sau để biết chi tiết về việc phục vụ đúng cách tệp đã lưu từ đĩa hoặc cơ sở dữ liệu trở lại máy khách:

Xác định mẫu

Hướng tới các câu trả lời sau đây về cách tải lên bằng Ajax (và jQuery). Xin lưu ý rằng mã servlet để thu thập dữ liệu biểu mẫu không cần phải thay đổi cho việc này! Chỉ có cách thay đổi cách bạn trả lời, nhưng điều này khá tầm thường (tức là thay vì chuyển tiếp tới JSP, chỉ cần in một số JSON hoặc XML hoặc thậm chí văn bản đơn giản tùy thuộc vào bất kỳ kịch bản nào chịu trách nhiệm cho lệnh gọi Ajax đang mong đợi).


Hy vọng tất cả điều này sẽ giúp :)


À xin lỗi, tôi đã nhìn thấy request.getParts("file")và bối rối x_x
Kagami Sascha Rosylight

Với Servlet 3.0, nếu một MultipartConfigđiều kiện bị vi phạm (ví dụ maxFileSize:), việc gọi request.getParameter()trả về null. Đây có phải là mục đích? Điều gì xảy ra nếu tôi nhận được một số tham số (văn bản) thông thường trước khi gọi getPart(và kiểm tra một IllegalStateException)? Điều này khiến a NullPointerExceptionbị ném trước khi tôi có cơ hội kiểm tra IllegalStateException.
theyuv

@BalusC Tôi đã tạo một bài đăng liên quan đến vấn đề này, bạn có biết làm thế nào tôi có thể truy xuất thêm các thông tin bổ sung từ tệp API webKitDirectory. Thêm chi tiết tại đây stackoverflow.com/questions/45419598/
Kẻ

Nếu bạn không sử dụng Servlet 3.0 và sử dụng thủ thuật FileUpload, tôi thấy bạn không thể đọc tệp từ yêu cầu nhiều lần. Nếu bạn cần chức năng này, bạn có thể muốn xem MultiPartFilter của Spring. Bài đăng này có một ví dụ hoạt động tốt: stackoverflow.com/a/21448087/1048376
giật gân

1
Vâng, nếu ai đó cố gắng sử dụng mã trong phần 3.0 với tomcat 7, họ có thể gặp phải vấn đề String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.tương tự như tôi
raviraja

26

Nếu bạn tình cờ sử dụng Spring MVC, đây là cách: (Tôi sẽ để nó ở đây trong trường hợp ai đó thấy nó hữu ích).

Sử dụng một biểu mẫu với enctypethuộc tính được đặt thành " multipart/form-data" (Giống như Câu trả lời của BalusC)

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

Trong bộ điều khiển của bạn, ánh xạ tham số yêu cầu fileđể MultipartFilegõ như sau:

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

Bạn có thể lấy tên tập tin và kích thước sử dụng MultipartFile's getOriginalFilename()getSize().

Tôi đã thử nghiệm điều này với phiên bản Spring 4.1.1.RELEASE.


Nếu tôi không nhầm, điều này yêu cầu bạn cấu hình một bean trong cấu hình ứng dụng của máy chủ của bạn ...
Kenny Worden

11

Bạn cần có common-io.1.4.jartệp để được bao gồm trong libthư mục của mình hoặc nếu bạn đang làm việc trong bất kỳ trình soạn thảo nào, như NetBeans, thì bạn cần phải đi đến các thuộc tính dự án và chỉ cần thêm tệp JAR và bạn sẽ hoàn thành.

Để lấy common.io.jartệp, chỉ cần google nó hoặc chỉ cần truy cập trang web Apache Tomcat nơi bạn có tùy chọn tải xuống miễn phí tệp này. Nhưng hãy nhớ một điều: tải xuống tệp ZIP nhị phân nếu bạn là người dùng Windows.


Không thể tìm thấy .jarnhưng .zip. Ý bạn là .zipsao
Malwinder Singh

10

Không có thành phần hoặc Thư viện bên ngoài trong Tomcat 6 o 7

Kích hoạt tính năng Tải lên trong tệp web.xml :

http://joseluisbz.wordpress.com/2014/01/17/manual-installing-php-tomcat-and-httpd-lounge/#Eneac%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>

NHƯ BẠN CÓ THỂ XEM :

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

Tải lên các tệp bằng cách sử dụng JSP. Các tập tin:

Trong tệp html

<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=""/>

Trong File JSP hoặc Servlet

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

Chỉnh sửa mã của bạn thành các yêu cầu của servlet, như kích thước tệp tối đa , kích thước yêu cầu tối đa và các tùy chọn khác mà bạn có thể đặt ...


9

Tôi đang sử dụng Servlet chung cho mọi Biểu mẫu Html cho dù nó có tệp đính kèm hay không. Servlet này trả về TreeMapnơi các khóa là tên jsp Tham số và giá trị là Đầu vào của người dùng và lưu tất cả các tệp đính kèm trong thư mục cố định và sau đó bạn đổi tên thư mục bạn chọn. Kết nối này là giao diện tùy chỉnh của chúng tôi có đối tượng kết nối. Tôi nghĩ rằng điều này sẽ giúp bạn

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

@buhake sindi hey cái gì sẽ là filepath nếu tôi sử dụng máy chủ trực tiếp hoặc tôi sống dự án của mình bằng cách tải tệp lên máy chủ
AmanS

2
Bất kỳ thư mục nào trong máy chủ trực tiếp. Nếu bạn viết mã để tạo một thư mục trong servlet thì thư mục sẽ được tạo trong srver trực tiếp
cảm thấy tốt và lập trình

8

Đối với Spring MVC, tôi đã cố gắng hàng giờ để làm điều này và quản lý để có một phiên bản đơn giản hơn, hoạt động để lấy mẫu nhập cả dữ liệu và hình ảnh.

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

Bộ điều khiển để xử lý

@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");
    }
}

Hy vọng nó giúp :)


Bạn có thể vui lòng chia sẻ hình ảnh chọn db mysql và hiển thị nó trên jsp / html không?
Ved Prakash

6

Một nguồn khác của vấn đề này xảy ra nếu bạn đang sử dụng Geronimo với Tomcat nhúng của nó. Trong trường hợp này, sau nhiều lần lặp lại kiểm tra tải commons-io và commons-fileup, vấn đề phát sinh từ một trình nạp lớp cha mẹ xử lý các tệp commons-xxx. Điều này phải được ngăn chặn. Sự cố luôn xảy ra tại:

fileItems = uploader.parseRequest(request);

Lưu ý rằng loại Danh sách của tệp. Các tệp đã thay đổi với phiên bản hiện tại của tải trọng tệp chung, đặc biệt List<FileItem>là trái ngược với các phiên bản trước đó là chung List.

Tôi đã thêm mã nguồn cho commons-fileupload và commons-io vào dự án Eclipse của tôi để theo dõi lỗi thực tế và cuối cùng đã hiểu rõ hơn. Đầu tiên, ngoại lệ được ném là loại throwable không phải là FileIOException đã nêu hay thậm chí là Exception (những thứ này sẽ không bị mắc kẹt). Thứ hai, thông báo lỗi bị che khuất ở chỗ nó tuyên bố không tìm thấy lớp vì trục2 không thể tìm thấy commons-io. Axis2 hoàn toàn không được sử dụng trong dự án của tôi mà tồn tại dưới dạng một thư mục trong thư mục con kho lưu trữ Geronimo như một phần của cài đặt tiêu chuẩn.

Cuối cùng, tôi tìm thấy 1 nơi đặt ra giải pháp làm việc giải quyết thành công vấn đề của tôi. Bạn phải ẩn các tệp từ trình tải cha trong kế hoạch triển khai. Điều này đã được đưa vào geronimo-web.xml với tệp đầy đủ của tôi được hiển thị bên dưới.

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

Đây là một ví dụ sử dụng apache commons-fileupload:

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

Cách đơn giản nhất có thể đưa ra đối với các tệp và kiểm soát đầu vào, loại bỏ một tỷ thư viện:

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

bạn có thể tải lên tệp bằng jsp / servlet.

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

mặt khác máy chủ. sử dụng mã sau đây.

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

Từ đối tượng này, bạn phải lấy các mục và trường tệp sau đó yo có thể lưu trữ vào máy chủ như sau:

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

-2

Gửi nhiều tệp cho tệp chúng tôi phải sử dụng enctype="multipart/form-data"
và gửi nhiều tệp sử dụng multiple="multiple"trong thẻ đầu vào

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

2
Làm thế nào chúng ta sẽ thực hiện getPart ("fileattachments") để chúng ta có được một mảng các bộ phận thay thế? Tôi không nghĩ getPart cho nhiều tệp sẽ hoạt động?
CyberMew

-2

TRANG HTML

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

FILE PHỤC VỤ

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

Biên dịch trên servlet UploadServlet và tạo mục nhập bắt buộc trong tệp web.xml như sau.

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.