Apache Commons FileUpload дает исключение «Поток закрыт» при загрузке файла Java HttpServer - PullRequest
0 голосов
/ 30 сентября 2018

Я следовал примеру Загрузка файла с использованием HTTPHandler , чтобы создать метод загрузки файла на Java com.sun.net.httpserver.HttpServer следующим образом:

protected String[] uploadFile(String folder, String name, String mime){
        //This is just the current HttpExchange
        HttpExchange he = this.rawExchange;
        DiskFileItemFactory d = new DiskFileItemFactory();
        try {
            d.setRepository(new File(this.root));
            ServletFileUpload up = new ServletFileUpload(d);
            List<FileItem> result = up.parseRequest(new RequestContext(){
                public String getCharacterEncoding(){
                    return "UTF-8";
                }
                public int getContentLength(){
                    return 0;
                }
                public String getContentType(){
                    return he.getRequestHeaders().getFirst("Content-Type");
                }
                public InputStream getInputStream() throws IOException {
                    return he.getRequestBody();
                }
            });
            ArrayList<String> files = new ArrayList<>();
            for(FileItem item : result){
                if(item.isFormField()){
                    String fileStr = folder;
                    String fileName = item.getName();
                    if(folder == null){
                        fileStr = "";
                    }
                    if(name == null){
                        fileStr = fileName;
                    }else{
                        fileStr = name;
                    }
                    if(mime == null && name != null){
                        fileStr += "." + fileName.split(".")[fileName.length() - 1];
                    }else if(mime != null){
                        fileStr += mime;
                    }
                    File toUpload = new File(fileStr);  
                    item.write(toUpload);  
                    files.add(fileStr);                
                }
            }
            String[] fileArray = new String[files.size()];
            fileArray = files.toArray(fileArray);
            return fileArray;
        }catch(Exception ioe){
            System.out.println("Error uploading file: " + ioe);
            ioe.printStackTrace();
            return null;
        }
    }

Я использую его в patch контроллереметод ниже:

public void patch() throws Exception {
    User user = new User((String) super.session.get("id"));
    Class<?> c = user.getClass();
    for(String key : super.body.keySet()){
        try{
            Field f = c.getField(key);
            f.set(user, super.body.get(key));
        }catch(NoSuchFieldException n){}
    }
    if(super.query.get("key").equals("avatar")){
        //uploadFile is called here
        String[] filename = super.uploadFile("/public/", user.id, null);
        user.avatar = filename[0];
    }
    user.update();
    super.redirect("/user/" + user.id, 302);
}

Однако, я получаю эту ошибку на up.parseRequest в методе UploadFile.

Error uploading file: org.apache.commons.fileupload.FileUploadException: Stream is closed
org.apache.commons.fileupload.FileUploadException: Stream is closed
        at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362)
        at advance.Controller.uploadFile(Controller.java:251)
        at app.controllers.UserController.patch(UserController.java:41)
        at advance.Controller.handle(Controller.java:183)
        at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
        at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
        at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:82)
        at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:675)
        at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
        at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:647)
        at sun.net.httpserver.ServerImpl$DefaultExecutor.execute(ServerImpl.java:158)
        at sun.net.httpserver.ServerImpl$Dispatcher.handle(ServerImpl.java:431)
        at sun.net.httpserver.ServerImpl$Dispatcher.run(ServerImpl.java:396)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Stream is closed
        at sun.net.httpserver.LeftOverInputStream.read(LeftOverInputStream.java:97)
        at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:999)
        at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:903)
        at java.io.InputStream.read(InputStream.java:101)
        at org.apache.commons.fileupload.util.Streams.copy(Streams.java:100)
        at org.apache.commons.fileupload.util.Streams.copy(Streams.java:70)

Что происходит и как я могу исправить эту проблему?Я использую базовую платформу (исходный код https://github.com/isaackrementsov/advance-java), который построен поверх HttpServer.

...