use of com.dtflys.forest.multipart.ForestMultipart in project forest by dromara.
the class TestUploadClient method testUploadPathMap.
/**
* Test Path Collections *
*/
@Test
public void testUploadPathMap() throws InterruptedException, FileUploadException {
server.enqueue(new MockResponse().setBody(EXPECTED));
String path1 = this.getClass().getResource("/test-img.jpg").getPath();
String path2 = this.getClass().getResource("/test-img2.jpg").getPath();
Map<String, String> pathMap = new LinkedHashMap<>();
pathMap.put("test-map-1.jpg", path1);
pathMap.put("test-map-2.jpg", path2);
for (String key : pathMap.keySet()) {
String value = pathMap.get(key);
if (isWindows() && value.startsWith("/")) {
value = value.substring(1);
}
pathMap.put(key, value);
}
ForestRequest<Map> request = uploadClient.uploadPathMap(pathMap);
assertNotNull(request);
List<ForestMultipart> multipartList = request.getMultiparts();
assertEquals(2, multipartList.size());
// assertTrue(Map.class.isAssignableFrom(request.getLifeCycleHandler().getResultType()));
int i = 1;
for (ForestMultipart multipart : multipartList) {
assertTrue(multipart instanceof FilePathMultipart);
assertEquals("file", multipart.getName());
File file = multipart.getFile();
assertNotNull(file);
assertEquals("test-map-" + i + ".jpg", multipart.getOriginalFileName());
i++;
}
Map result = (Map) request.execute();
assertNotNull(result);
MockServerRequest.mockRequest(server).assertMultipart("file", fileItems -> {
assertEquals(2, fileItems.size());
FileItem fileItem1 = fileItems.get(0);
assertEquals("test-map-1.jpg", fileItem1.getName());
assertEquals("image/jpeg", fileItem1.getContentType());
try {
byte[] bytes = IOUtils.toByteArray(fileItem1.getInputStream());
assertArrayEquals(IOUtils.toByteArray(new FileInputStream(path1)), bytes);
} catch (IOException e) {
throw new RuntimeException(e);
}
FileItem fileItem2 = fileItems.get(1);
assertEquals("test-map-2.jpg", fileItem2.getName());
assertEquals("image/jpeg", fileItem2.getContentType());
try {
byte[] bytes = IOUtils.toByteArray(fileItem2.getInputStream());
assertArrayEquals(IOUtils.toByteArray(new FileInputStream(path2)), bytes);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
use of com.dtflys.forest.multipart.ForestMultipart in project forest by dromara.
the class HttpclientBodyBuilder method setFileBody.
@Override
protected void setFileBody(T httpReq, ForestRequest request, Charset charset, String contentType, LifeCycleHandler lifeCycleHandler) {
String boundary = request.getBoundary();
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
if (StringUtils.isNotEmpty(boundary)) {
entityBuilder.setBoundary(boundary);
}
// 解决文件名乱码问题
ForestJsonConverter jsonConverter = request.getConfiguration().getJsonConverter();
Charset httpCharset = charset;
Charset itemCharset = StandardCharsets.UTF_8;
if (charset != null) {
itemCharset = charset;
}
boolean needSetMode = false;
for (ForestRequestBody item : request.body()) {
if (item instanceof NameValueRequestBody) {
needSetMode = true;
NameValueRequestBody nameValueItem = (NameValueRequestBody) item;
String name = nameValueItem.getName();
Object value = nameValueItem.getValue();
String partContentType = nameValueItem.getContentType();
addMultipart(entityBuilder, name, value, partContentType, itemCharset, jsonConverter);
} else if (item instanceof ObjectRequestBody) {
Object obj = ((ObjectRequestBody) item).getObject();
if (obj == null) {
continue;
}
needSetMode = true;
Map<String, Object> attrs = jsonConverter.convertObjectToMap(obj);
for (Map.Entry<String, Object> entry : attrs.entrySet()) {
String name = entry.getKey();
Object value = entry.getValue();
addMultipart(entityBuilder, name, value, null, itemCharset, jsonConverter);
}
}
}
if (needSetMode) {
entityBuilder.setCharset(httpCharset);
entityBuilder.setMode(HttpMultipartMode.RFC6532);
}
List<ForestMultipart> multiparts = request.getMultiparts();
for (ForestMultipart multipart : multiparts) {
String name = multipart.getName();
String fileName = multipart.getOriginalFileName();
String partContentType = multipart.getContentType();
ContentType ctype = null;
if (StringUtils.isNotEmpty(partContentType)) {
ctype = ContentType.create(partContentType, httpCharset);
}
if (ctype == null) {
String mimeType = URLConnection.guessContentTypeFromName(fileName);
if (mimeType == null) {
// guess this is a video uploading
ctype = ContentType.create(com.dtflys.forest.backend.ContentType.MULTIPART_FORM_DATA, httpCharset);
} else {
ctype = ContentType.create(mimeType);
}
}
AbstractContentBody contentBody = null;
if (multipart.isFile()) {
contentBody = new HttpclientMultipartFileBody(request, multipart.getFile(), ctype, fileName, lifeCycleHandler);
} else {
contentBody = new HttpclientMultipartCommonBody(request, multipart, ctype, fileName, lifeCycleHandler);
}
entityBuilder.addPart(name, contentBody);
}
HttpEntity entity = entityBuilder.build();
httpReq.setEntity(entity);
}
use of com.dtflys.forest.multipart.ForestMultipart in project forest by dromara.
the class TestUploadClient method testMixtureUploadImage.
@Test
public void testMixtureUploadImage() throws InterruptedException, FileUploadException {
server.enqueue(new MockResponse().setBody(EXPECTED));
String path = Objects.requireNonNull(this.getClass().getResource("/test-img.jpg")).getPath();
if (path.startsWith("/") && isWindows()) {
path = path.substring(1);
}
File file = new File(path);
Map<String, Object> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
ForestRequest request = uploadClient.imageUploadWithMapParams("img1.jpg", file, map);
assertNotNull(request);
List<ForestMultipart> multipartList = request.getMultiparts();
assertEquals(1, multipartList.size());
ForestMultipart multipart = multipartList.get(0);
// assertTrue(Map.class.isAssignableFrom(request.getMethod().getReturnClass()));
assertTrue(multipart instanceof FileMultipart);
assertEquals("file", multipart.getName());
assertEquals("img1.jpg", multipart.getOriginalFileName());
Map result = (Map) request.execute();
assertNotNull(result);
MockServerRequest.mockRequest(server).assertMultipart("file", multiparts -> {
assertEquals(1, multiparts.size());
FileItem fileItem = multiparts.get(0);
assertEquals("img1.jpg", fileItem.getName());
assertEquals("image/jpeg", fileItem.getContentType());
}).assertMultipart("a", params -> {
assertEquals(1, params.size());
FileItem item = params.get(0);
ContentType contentType = new ContentType(item.getContentType());
assertEquals("text/plain", contentType.toStringWithoutParameters());
try {
assertEquals("1", IOUtils.toString(item.getInputStream()));
} catch (IOException e) {
throw new RuntimeException(e);
}
}).assertMultipart("b", params -> {
assertEquals(1, params.size());
FileItem item = params.get(0);
ContentType contentType = new ContentType(item.getContentType());
assertEquals("text/plain", contentType.toStringWithoutParameters());
try {
assertEquals("2", IOUtils.toString(item.getInputStream()));
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
use of com.dtflys.forest.multipart.ForestMultipart in project forest by dromara.
the class TestUploadClient method testUploadInputStream.
@Test
public void testUploadInputStream() throws IOException, InterruptedException, FileUploadException {
server.enqueue(new MockResponse().setBody(EXPECTED));
String path = this.getClass().getResource("/test-img.jpg").getPath();
if (path.startsWith("/") && isWindows()) {
path = path.substring(1);
}
File file = new File(path);
InputStream in = new FileInputStream(file);
ForestRequest<Map> request = uploadClient.upload(in, "test-byte-array.jpg");
assertNotNull(request);
assertTrue(StringUtils.isNotEmpty(request.getBoundary()));
List<ForestMultipart> multipartList = request.getMultiparts();
assertEquals(1, multipartList.size());
ForestMultipart multipart = multipartList.get(0);
// assertTrue(Map.class.isAssignableFrom(request.getMethod().getReturnClass()));
assertTrue(multipart instanceof InputStreamMultipart);
assertEquals("file", multipart.getName());
assertEquals("test-byte-array.jpg", multipart.getOriginalFileName());
Map result = (Map) request.execute();
assertNotNull(result);
MockServerRequest.mockRequest(server).assertMultipart("file", fileItems -> {
assertEquals(1, fileItems.size());
FileItem fileItem = fileItems.get(0);
assertEquals("test-byte-array.jpg", fileItem.getName());
assertEquals("image/jpeg", fileItem.getContentType());
try {
byte[] bytes = IOUtils.toByteArray(fileItem.getInputStream());
assertArrayEquals(IOUtils.toByteArray(new FileInputStream(file)), bytes);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
use of com.dtflys.forest.multipart.ForestMultipart in project forest by dromara.
the class TestUploadClient method testUploadPathList2.
@Test
public void testUploadPathList2() throws InterruptedException, FileUploadException {
server.enqueue(new MockResponse().setBody(EXPECTED));
URL[] urlArray = new URL[] { this.getClass().getResource("/test-img.jpg"), this.getClass().getResource("/test-img2.jpg") };
List<String> pathList = new LinkedList<>();
for (URL url : urlArray) {
String path = getPathFromURL(url);
pathList.add(path);
}
ForestRequest<Map> request = uploadClient.uploadPathList2(pathList);
assertNotNull(request);
List<ForestMultipart> multipartList = request.getMultiparts();
assertEquals(2, multipartList.size());
// assertTrue(Map.class.isAssignableFrom(request.getMethod().getReturnClass()));
int i = 0;
for (ForestMultipart multipart : multipartList) {
assertTrue(multipart instanceof FilePathMultipart);
assertEquals("file_" + i, multipart.getName());
File file = multipart.getFile();
assertNotNull(file);
URL url = urlArray[i];
assertEquals(getPathFromURL(url), file.getAbsolutePath().replaceAll("\\\\", "/"));
assertEquals(getPathFromURL(url), ((FilePathMultipart) multipart).getFilePath());
assertEquals("test-img-" + i + ".jpg", multipart.getOriginalFileName());
i++;
}
Map result = (Map) request.execute();
assertNotNull(result);
MockServerRequest.mockRequest(server).assertMultipart("file_0", fileItems -> {
assertEquals(1, fileItems.size());
FileItem fileItem1 = fileItems.get(0);
assertEquals("test-img-0.jpg", fileItem1.getName());
assertEquals("image/jpeg", fileItem1.getContentType());
try {
byte[] bytes = IOUtils.toByteArray(fileItem1.getInputStream());
URL url = urlArray[0];
assertNotNull(url);
assertArrayEquals(IOUtils.toByteArray(new FileInputStream(url.getFile())), bytes);
} catch (IOException e) {
throw new RuntimeException(e);
}
}).assertMultipart("file_1", fileItems -> {
assertEquals(1, fileItems.size());
FileItem fileItem1 = fileItems.get(0);
assertEquals("test-img-1.jpg", fileItem1.getName());
assertEquals("image/jpeg", fileItem1.getContentType());
try {
byte[] bytes = IOUtils.toByteArray(fileItem1.getInputStream());
URL url = urlArray[1];
assertNotNull(url);
assertArrayEquals(IOUtils.toByteArray(new FileInputStream(url.getFile())), bytes);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
Aggregations