@Override public InputStream getInputStream() throws IOException { return new FileInputStream(fileUpload.uploadedFileName()); }
@Override public String getName() { return fileUpload.name(); }
private void testFileUpload(String uploadsDir, int size) throws Exception { String name = "somename"; String fileName = "somefile.dat"; String contentType = "application/octet-stream"; Buffer fileData = TestUtils.randomBuffer(size); router.route().handler(rc -> { Set<FileUpload> fileUploads = rc.fileUploads(); assertNotNull(fileUploads); assertEquals(1, fileUploads.size()); FileUpload upload = fileUploads.iterator().next(); assertEquals(name, upload.name()); assertEquals(fileName, upload.fileName()); assertEquals(contentType, upload.contentType()); assertEquals("binary", upload.contentTransferEncoding()); assertEquals(fileData.length(), upload.size()); String uploadedFileName = upload.uploadedFileName(); assertTrue(uploadedFileName.startsWith(uploadsDir + File.separator)); Buffer uploaded = vertx.fileSystem().readFileBlocking(uploadedFileName); assertEquals(fileData, uploaded); // the data is upload as HTML form, so the body should be empty Buffer rawBody = rc.getBody(); assertEquals(0, rawBody.length()); rc.response().end(); }); sendFileUploadRequest(fileData, 200, "OK"); }
private boolean isHandleUpload(FileUpload upload, String startKey) { LOGGER.info( "CHECKING: " + upload.uploadedFileName() + " | fileName: " + upload.fileName() + " | name: " + upload.name()); String fieldName = upload.name().toLowerCase(); if (upload.size() <= 0) { LOGGER.info("NOT HANDLED: upload size is zero: " + upload.uploadedFileName() + " | fileName" + upload.fileName() + " | " + upload.name()); return false; } if (!fieldName.startsWith(startKey)) { LOGGER.info("NOT HANDLED: fieldname does not start with:" + startKey + " | " + fieldName); return false; } return true; }
public UploadedFileImpl(Vertx vertx, HttpServerRequest req, FileUpload fu) { this.fu = fu; this.req = req; this.vertx = vertx; this.originalName = fu.fileName(); this.fileName = fu.uploadedFileName(); this.contentType = fu.contentType(); this.size = fu.size(); }
LOGGER.info("FileName: {}", upload.fileName()); if (!"file".equals(upload.name())) { removeFiles(new File(upload.uploadedFileName())); continue; LOGGER.info("UploadedFileName: {}", upload.fileName()); future -> { try { future.complete(sanitize(upload.uploadedFileName())); } catch (IOException | BleachException e) { LOGGER.error("Error", e); sendFile(routingContext, upload.fileName(), saneFile); removeFiles(new File(upload.uploadedFileName()), saneFile); });
private void processMultipart(final HttpPost request, final FileUpload fileUpload, final File file) { final ContentType contentType = ContentType.create(fileUpload.contentType()); LOGGER.info("[ ZERO ] Read file from file system: {0}", file.getAbsolutePath()); final FileBody fileBody = new FileBody(file, contentType); final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); /* * Custom content disposition * Because Api Gateway will send the request to micro service * It means that the content-disposition must be calculated by api gateway internally * here. * Now it's working to redirect request to micro service. * Related submitted issue: * https://github.com/vert-x3/vertx-web/issues/1137 */ final String disposition = "form-data; name=\"file\"; " + "filename=\"" + fileUpload.fileName() + ""; final FormBodyPart bodyPart = FormBodyPartBuilder.create() .setName("file") .addField("Content-Type", fileUpload.contentType()) .addField("Content-Transfer-Encoding", fileUpload.contentTransferEncoding()) .addField("Content-Disposition", disposition) .setBody(fileBody) .build(); builder.addPart(bodyPart); final HttpEntity entity = builder.build(); request.setEntity(entity); }
/** * Adds the upload route to the given router * * @param router the upload route is added to the given router */ private void setRouterAPI(Router router) { // API route for handling file uploads. router.route("/api/upload").handler(context -> { Iterator<FileUpload> iterator = context.fileUploads().iterator(); if (iterator.hasNext()) { MultiMap params = context.request().params(); logger.info("Receiving uploaded file with request id " + params.get(UPLOAD_ID)); FileUpload upload = context.fileUploads().iterator().next(); parse(upload.uploadedFileName(), params, upload.fileName(), onComplete(context, upload.fileName())); } else { context.put(MESSAGE, NO_FILE_WAS_UPLOADED); context.reroute(ERROR); } }); }
@Override public String getSubmittedFileName() { return fileUpload.fileName(); }
@Override public Object extract(String name, Parameter parameter, RoutingContext context) { FormParameter formParam = (FormParameter) parameter; if ("file".equals(formParam.getType())) { for (FileUpload file : context.fileUploads()) { if (file.name().equals(name)) { return file.uploadedFileName(); } } if(formParam.getRequired()) throw new IllegalArgumentException("Missing required parameter: " + name); return null; } else return this.extract(name, parameter, context.request().formAttributes()); } }
private void handleFileUploads(String entityName, RoutingContext context, Map<String, String> params) { String startKey = entityName.toLowerCase() + "."; Set<FileUpload> fileUploads = context.fileUploads(); FileSystem fs = getPersistenceController().getVertx().fileSystem(); LOGGER.info("Number of fileuploads: " + fileUploads.size()); for (FileUpload upload : fileUploads) { if (isHandleUpload(upload, startKey)) { try { String fieldName = upload.name().toLowerCase(); LOGGER.info("uploaded file detected for field name " + fieldName + ", fileName: " + upload.fileName()); String relativePath = handleOneFile(fs, upload); String pureKey = fieldName.substring(startKey.length()); params.put(pureKey, relativePath); } catch (Exception e) { context.fail(e); } } } }
@Override public long getSize() { return fileUpload.size(); }
@Override public String getContentType() { return fileUpload.contentType(); }
/** * @return the content transfer encoding of the upload - this describes how the upload was encoded in the form submission. */ public String contentTransferEncoding() { String ret = delegate.contentTransferEncoding(); return ret; }
private void checkFileUpload(TestContext context, int count, String fileName, String fieldName, String contentType, String uploadsDir, Buffer fileData) { Set<FileUpload> fileUploads = StandarRequestController.fileUploads; context.assertNotNull(fileUploads); context.assertEquals(1, fileUploads.size()); FileUpload upload = fileUploads.iterator().next(); context.assertEquals(fieldName, upload.name()); context.assertEquals(fileName, upload.fileName()); context.assertEquals(contentType, upload.contentType()); context.assertEquals("binary", upload.contentTransferEncoding()); context.assertEquals(fileData.length(), (int) upload.size()); String uploadedFileName = upload.uploadedFileName(); context.assertTrue(uploadedFileName.startsWith(uploadsDir + File.separator)); Buffer uploaded = vertx.fileSystem().readFileBlocking(uploadedFileName); context.assertEquals(fileData, uploaded); }
@Override public void handle(RoutingContext context) { LOGGER.info("LOGGING REQUEST FOR " + context.request().path()); MultiMap headers = context.request().headers(); LOGGER.info("HEADERS: " + headers.size()); headers.entries().forEach(entry -> LOGGER.info(" " + entry.getKey() + ": " + entry.getValue())); MultiMap params = context.request().params(); LOGGER.info("PARAMETER: " + params.size()); params.entries().forEach(entry -> LOGGER.info(" " + entry.getKey() + ": " + entry.getValue())); MultiMap formAttributes = context.request().formAttributes(); LOGGER.info("FORM_ATTRIBUTES: " + formAttributes.size()); formAttributes.entries().forEach(entry -> LOGGER.info(" " + entry.getKey() + ": " + entry.getValue())); Set<FileUpload> fileUploads = context.fileUploads(); LOGGER.info("FILE UPLOADS: " + fileUploads.size()); fileUploads.forEach(fu -> LOGGER.info(" NAME: " + fu.name() + " | FILENAME: " + fu.fileName() + " | UPLOADED: " + fu.uploadedFileName() + " | SIZE: " + fu.size())); LOGGER.info("USER: " + context.user()); context.next(); }
private void processMultipart(final HttpPost request, final FileUpload fileUpload, final File file) { final ContentType contentType = ContentType.create(fileUpload.contentType()); LOGGER.info("[ ZERO ] Read file from file system: {0}", file.getAbsolutePath()); final FileBody fileBody = new FileBody(file, contentType); final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); /* * Custom content disposition * Because Api Gateway will send the request to micro service * It means that the content-disposition must be calculated by api gateway internally * here. * Now it's working to redirect request to micro service. * Related submitted issue: * https://github.com/vert-x3/vertx-web/issues/1137 */ final String disposition = "form-data; name=\"file\"; " + "filename=\"" + fileUpload.fileName() + ""; final FormBodyPart bodyPart = FormBodyPartBuilder.create() .setName("file") .addField("Content-Type", fileUpload.contentType()) .addField("Content-Transfer-Encoding", fileUpload.contentTransferEncoding()) .addField("Content-Disposition", disposition) .setBody(fileBody) .build(); builder.addPart(bodyPart); final HttpEntity entity = builder.build(); request.setEntity(entity); }
/** * @return the file name of the upload as provided in the form submission */ public String fileName() { String ret = delegate.fileName(); return ret; }
/** * @return the size of the upload, in bytes */ public long size() { long ret = delegate.size(); return ret; }