Я следовал примеру Загрузка файла с использованием 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
.