Skip to content

Instantly share code, notes, and snippets.

@downgoon
Created May 3, 2017 06:46
Show Gist options
  • Save downgoon/10b57de09c8f2b18c857374c27df113a to your computer and use it in GitHub Desktop.
Save downgoon/10b57de09c8f2b18c857374c27df113a to your computer and use it in GitHub Desktop.
uploading

UploadAction

import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.FileUpload;
import io.vertx.ext.web.RoutingContext;

public class DbmetaAction {

	private static final Logger LOG = LoggerFactory.getLogger(DbmetaAction.class);

	public void upload(RoutingContext routingContext) {
		String dbName = routingContext.request().getParam("dbName");
		LOG.info("meta for database: {}", dbName);

		JsonObject json = new JsonObject(); // response
		Set<FileUpload> uploads = routingContext.fileUploads();
		for (FileUpload fupload : uploads) {
			
			LOG.info("name: {}, fileName: {}, uploadedFileName: {}", fupload.name(), fupload.fileName(),
					fupload.uploadedFileName());

			LOG.info("size: {}, contentType: {}, charSet: {}, contentTransferEncoding: {} ", fupload.size(),
					fupload.contentType(), fupload.charSet(), fupload.contentTransferEncoding());
			
			json.put(fupload.name(), fupload.uploadedFileName());
		}
		
		routingContext.response().putHeader("Content-Type", "application/json;charset=UTF-8");
		routingContext.response().end(json.toString());
		
	}
}

Router

Router dbmetaRouter = Router.router(vertx);
mainRouter.mountSubRouter("/dbmeta", dbmetaRouter);

// main.dbmeta
DbmetaAction dbmetaAction = new DbmetaAction();
dbmetaRouter.route().handler(BodyHandler.create());
dbmetaRouter.route(HttpMethod.POST, "/:dbname").handler(dbmetaAction::upload);

Client Testing

$ curl -F "fname=@test.sh" http://127.0.0.1:8080/dbmeta/employee -i
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 61

{"fname":"file-uploads/95b232e5-6fbb-4694-aec4-4d2f06bfcd69"}%
@downgoon
Copy link
Author

downgoon commented May 3, 2017

解包文件

dbmetaRouter.route().handler(BodyHandler.create());
dbmetaRouter.route(HttpMethod.POST, "/:dbname").handler(dbmetaAction::upload);

请求处理分两个阶段:

  • 上传文件:HTTP请求包体内容由BodyHandler处理,并写入本地磁盘。
  • meta处理:文件存入磁盘后,BodyHandler会把请求传递给下一个Handler,并在上下文环境变量中 routingContext.fileUploads(); 设置了文件的meta信息(包括:文件容量大小,文件名称,文件磁盘地址,文件ContentType和CharSet)。
Set<FileUpload> uploads = routingContext.fileUploads();
for (FileUpload fupload : uploads) {
			
      LOG.info("name: {}, fileName: {}, uploadedFileName: {}", fupload.name(), fupload.fileName(),
					fupload.uploadedFileName());

       LOG.info("size: {}, contentType: {}, charSet: {}, contentTransferEncoding: {} ", fupload.size(),
					fupload.contentType(), fupload.charSet(), fupload.contentTransferEncoding());
			
     json.put(fupload.name(), fupload.uploadedFileName());
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment