Выбор нескольких файлов и загрузка их с помощью Джерси

Мне нужна помощь с загрузкой нескольких файлов с помощью Джерси. Я использовал следующий код для загрузки одного файла с помощью Jersey.

package my.first.rest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;



import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;

@Path("uploadfile")
public class Upload {
String location;



    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public  String uploadfile(@FormDataParam("file") InputStream is, @FormDataParam("file") FormDataContentDisposition filedetail){



        saveToDisk(is,filedetail);
        return  "File Uploaded Succesfully_"+location;

    }


    private void saveToDisk(InputStream is1,
            FormDataContentDisposition filedetail) {
        // TODO Auto-generated method stub

         location = "E://upload/"+filedetail.getFileName();
        try{
            OutputStream out = new FileOutputStream(new File(location));
            int read = 0;
            byte[] bytes = new byte[1024];
            out = new FileOutputStream (new File(location));
            while((read = is1.read(bytes)) != -1){
                out.write(bytes,0,read);
            }
            out.flush();

            out.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }


}

Приведенный выше код хорошо работает с загрузкой одного файла, но когда я добавляю атрибут multiple="multiple" к тегу input type = file, я могу выбрать несколько элементов в одной загрузке, он загружает первый выбранный элемент и имя последнего выбранного элемента. Я не ожидаю, что код будет работать, потому что он не предназначен для обработки нескольких загрузок файлов, но должен быть способ обойти это, верно?? Так как он берет один файл и имя другого.

Я просмотрел несколько потоков stackoverflow и много гуглил. Я бы не опубликовал это, если бы нашел ответ. Я не хочу загружать несколько файлов, используя приведенные ниже типы кода:

<input type ="file" name="file">
<input type ="file" name="file">
<input type ="file" name="file2">

Я не хочу загружать несколько файлов по отдельности. Я хочу иметь возможность выбирать несколько файлов одновременно, и все они будут загружены куда-нибудь. Мой тег такой:

<input type ="file" name="file" multiple="multiple">

Вот весь HTML-код.

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action ="http://localhost:8080/fuseframework/uploadfile/upload" method="post" enctype="multipart/form-data">
file: 
<br>
<input type ="file" name="file" multiple="multiple">

<input type="submit" value="send">
</form>
</body>
</html>

Это банки, которые я использовал http://i.stack.imgur.com/1tVT8.png


person Ujjwal Subedi    schedule 09.09.2014    source источник


Ответы (3)


У меня работает нормально, чтобы использовать «FormDataMultiPart».

Вот код Java, объект FormDataContentDisposition (formParams) содержит фактическое содержимое файла.

List<FormDataBodyPart> parts = formParams.getFields("file");
for (FormDataBodyPart part : parts) {
    FormDataContentDisposition file = part.getFormDataContentDisposition();
}

На стороне JS я использую объект FormData и загружаю несколько файлов с одинаковым именем:

for (var i = 0; i < files.length; i++)
    fd.append('file', files[i]);

Желаю, чтобы это помогло

person 李骏骁    schedule 17.10.2014
comment
Чтобы получить содержимое файла, используйте: InputStream is = bodyPart.getEntityAs(InputStream.class); - person Gab; 18.11.2015
comment
когда я пытаюсь передать inputStream в качестве аргумента, я получаю исключение во время выполнения, в нем говорится, что DataHead $ReadMultiStream не сериализуем. Есть идеи? - person Rafael Ruiz Tabares; 03.08.2016

Эта вещь работала для меня очень хорошо:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void uploadMultiple(@FormDataParam("file") FormDataBodyPart body){
    for(BodyPart part : body.getParent().getBodyParts()){
        InputStream is = part.getEntityAs(InputStream.class);
        ContentDisposition meta = part.getContentDisposition();
        doUpload(is, meta);
    }
}
person dandeeee    schedule 06.12.2015

Этот ответ также позволяет вам добавить файл как @FormDataParam в класс @BeanParam, если его тип — FormDataBodyPart. FormDataMultiPart будет создаваться только как параметр в запросе и не будет создаваться при наследовании подклассом.

person MrAaronOlsen    schedule 22.07.2021