【问题标题】:Quarkus Multiple File UploadQuarkus 多文件上传
【发布时间】:2020-07-08 23:37:22
【问题描述】:

您好,我正在尝试使用多部分表单上传多个文件

我使用这个,但我得到了错误的请求状态,我怎样才能上传多个文件?


public class AttachmentBody {

    @FormParam("files")
    @PartType(MediaType.APPLICATION_OCTET_STREAM)
    public InputStream[] files;

}

【问题讨论】:

    标签: resteasy quarkus


    【解决方案1】:

    我在工作,我认为这对多个文件上传有帮助。我正在使用 RestEasy 和 Quarkus 框架。在代码下方找到。

    import java.io.File;
    import java.io.InputStream;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.nio.file.StandardOpenOption;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import javax.ws.rs.Consumes;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.MultivaluedMap;
    import javax.ws.rs.core.Response;
    
    import org.apache.commons.io.IOUtils;
    import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;
    import org.jboss.resteasy.plugins.providers.multipart.InputPart;
    import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
    
    @Path("/multiupload")
    public class MultiFileUploadController {
    
        private static String UPLOAD_DIR = "E:/sure-delete";
    
        @POST
        @Path("/files")
        @Consumes(MediaType.MULTIPART_FORM_DATA)
        @Produces(MediaType.TEXT_PLAIN)
        public Response handleFileUploadForm(@MultipartForm MultipartFormDataInput input) {
        
            Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
            List<String> fileNames = new ArrayList<>();
        
            List<InputPart> inputParts = uploadForm.get("file");
            System.out.println("inputParts size: " + inputParts.size());
            String fileName = null;
            for (InputPart inputPart : inputParts) {
                try {
        
                    MultivaluedMap<String, String> header = inputPart.getHeaders();
                    fileName = getFileName(header);
                    fileNames.add(fileName);
                    System.out.println("File Name: " + fileName);
                    InputStream inputStream = inputPart.getBody(InputStream.class, null);
                    byte[] bytes = IOUtils.toByteArray(inputStream);
        
                    File customDir = new File(UPLOAD_DIR);
                    fileName = customDir.getAbsolutePath() + File.separator + fileName;
                    Files.write(Paths.get(fileName), bytes, StandardOpenOption.CREATE_NEW);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            String uploadedFileNames = String.join(", ", fileNames);
            return Response.ok().entity("All files " + uploadedFileNames + " successfully.").build();
        }
        
        private String getFileName(MultivaluedMap<String, String> header) {
            String[] contentDisposition = header.getFirst("Content-Disposition").split(";");
            for (String filename : contentDisposition) {
                if ((filename.trim().startsWith("filename"))) {
                    String[] name = filename.split("=");
                    String finalFileName = name[1].trim().replaceAll("\"", "");
                    return finalFileName;
                }
            }
            return "unknown";
        }
    }
    

    要从邮递员客户端进行测试,请在图片下方找到。

    你可以以它为例也处理异常。

    【讨论】:

    • 不要做`byte[] bytes = IOUtils.toByteArray(inputStream);`当你上传更大的文件时,这会导致OOME。最好是Files.copy(inputStream, Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING);
    • 感谢@Stefan 强调。
    • 关闭MultipartFormDataInput对象也很重要,如果不关闭临时文件在方法调用后不会被删除,它们将在GC或JVM退出时被删除。 finally { /** * Call this method to delete any temporary files created from * unmarshalling this multipart message Otherwise they will be deleted on * Garbage Collection or JVM exit. */ input.close(); }
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2015-02-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多