Skip to content

Commit 5cebb23

Browse files
authored
Merge pull request #40 from GetStream/FEEDS-1060
[FEEDS-1060] fix file upload
2 parents 6267b17 + bfdbb30 commit 5cebb23

File tree

3 files changed

+132
-0
lines changed

3 files changed

+132
-0
lines changed

img.png

24.4 KB
Loading

src/main/java/io/getstream/services/framework/StreamRequest.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
import com.fasterxml.jackson.core.type.TypeReference;
55
import com.fasterxml.jackson.databind.ObjectMapper;
66
import io.getstream.exceptions.StreamException;
7+
import io.getstream.models.UploadFileRequest;
8+
import io.getstream.models.UploadImageRequest;
79
import io.getstream.models.framework.RateLimit;
810
import io.getstream.models.framework.StreamResponse;
11+
import java.io.File;
912
import java.io.IOException;
1013
import java.util.Date;
1114
import java.util.List;
@@ -38,6 +41,10 @@ public StreamRequest(
3841
RequestBody rawBody;
3942
if (List.of("GET", "DELETE", "HEAD", "OPTIONS").contains(method) || jRequest == null) {
4043
rawBody = null;
44+
} else if (jRequest instanceof UploadFileRequest) {
45+
rawBody = createMultipartBody((UploadFileRequest) jRequest);
46+
} else if (jRequest instanceof UploadImageRequest) {
47+
rawBody = createMultipartBody((UploadImageRequest) jRequest);
4148
} else {
4249
rawBody = RequestBody.create(objectMapper.writeValueAsBytes(jRequest));
4350
}
@@ -103,6 +110,62 @@ public HttpUrl buildUrl(
103110
return urlBuilder.build();
104111
}
105112

113+
private RequestBody createMultipartBody(UploadFileRequest request) throws IOException {
114+
if (request.getFile() == null || request.getFile().isEmpty()) {
115+
throw new IllegalArgumentException("File path must be provided");
116+
}
117+
118+
File file = new File(request.getFile());
119+
if (!file.exists()) {
120+
throw new IOException("File not found: " + request.getFile());
121+
}
122+
123+
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
124+
125+
// Add file
126+
RequestBody fileBody = RequestBody.create(file, MediaType.parse("application/octet-stream"));
127+
builder.addFormDataPart("file", file.getName(), fileBody);
128+
129+
// Add user field if present
130+
if (request.getUser() != null) {
131+
String userJson = objectMapper.writeValueAsString(request.getUser());
132+
builder.addFormDataPart("user", userJson);
133+
}
134+
135+
return builder.build();
136+
}
137+
138+
private RequestBody createMultipartBody(UploadImageRequest request) throws IOException {
139+
if (request.getFile() == null || request.getFile().isEmpty()) {
140+
throw new IllegalArgumentException("File path must be provided");
141+
}
142+
143+
File file = new File(request.getFile());
144+
if (!file.exists()) {
145+
throw new IOException("File not found: " + request.getFile());
146+
}
147+
148+
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
149+
150+
// Add file
151+
RequestBody fileBody = RequestBody.create(file, MediaType.parse("image/*"));
152+
builder.addFormDataPart("file", file.getName(), fileBody);
153+
154+
// Add upload_sizes field if present
155+
if (request.getUploadSizes() != null && !request.getUploadSizes().isEmpty()) {
156+
String uploadSizesJson = objectMapper.writeValueAsString(request.getUploadSizes());
157+
builder.addFormDataPart("upload_sizes", uploadSizesJson);
158+
}
159+
160+
// Add user field if present
161+
if (request.getUser() != null) {
162+
String userJson = objectMapper.writeValueAsString(request.getUser());
163+
builder.addFormDataPart("user", userJson);
164+
}
165+
166+
return builder.build();
167+
}
168+
106169
public StreamResponse<T> execute() throws StreamException {
107170
okhttp3.Call call = client.newCall(request);
108171
Response response;

src/test/java/io/getstream/FeedIntegrationTests.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,6 +1539,75 @@ void test32_RealWorldUsageDemo() throws Exception {
15391539
System.out.println("✅ Completed real-world usage scenario demonstration");
15401540
}
15411541

1542+
/** Test file upload functionality */
1543+
@Test
1544+
@Order(37)
1545+
void test37_UploadImage() throws Exception {
1546+
System.out.println("\n🖼️ Testing image upload...");
1547+
1548+
// snippet-start: UploadImage
1549+
UploadImageRequest imageUploadRequest =
1550+
UploadImageRequest.builder()
1551+
.file("img.png")
1552+
.user(OnlyUserID.builder().id(testUserId).build())
1553+
.uploadSizes(
1554+
List.of(
1555+
ImageSize.builder()
1556+
.width(100)
1557+
.height(100)
1558+
.resize("scale")
1559+
.crop("center")
1560+
.build()))
1561+
.build();
1562+
1563+
ImageUploadResponse imageResponse = common.uploadImage(imageUploadRequest).execute().getData();
1564+
// snippet-end: UploadImage
1565+
1566+
Assertions.assertNotNull(imageResponse, "Image upload response should not be null");
1567+
Assertions.assertNotNull(imageResponse.getFile(), "Uploaded image URL should not be null");
1568+
Assertions.assertTrue(
1569+
imageResponse.getFile().contains("http"), "Image URL should be a valid HTTP URL");
1570+
1571+
System.out.println("✅ Image uploaded successfully: " + imageResponse.getFile());
1572+
}
1573+
1574+
/** Test file upload functionality */
1575+
@Test
1576+
@Order(38)
1577+
void test38_UploadFile() throws Exception {
1578+
System.out.println("\n📄 Testing file upload...");
1579+
1580+
// Create a temporary test file
1581+
java.io.File tempFile = java.io.File.createTempFile("test-file-", ".txt");
1582+
java.nio.file.Files.writeString(
1583+
tempFile.toPath(),
1584+
"This is a test file for integration testing\nContains multiple lines\nWith various content");
1585+
1586+
try {
1587+
// snippet-start: UploadFile
1588+
UploadFileRequest fileUploadRequest =
1589+
UploadFileRequest.builder()
1590+
.file(tempFile.getAbsolutePath())
1591+
.user(OnlyUserID.builder().id(testUserId).build())
1592+
.build();
1593+
1594+
FileUploadResponse fileResponse = common.uploadFile(fileUploadRequest).execute().getData();
1595+
// snippet-end: UploadFile
1596+
1597+
Assertions.assertNotNull(fileResponse, "File upload response should not be null");
1598+
Assertions.assertNotNull(fileResponse.getFile(), "Uploaded file URL should not be null");
1599+
Assertions.assertTrue(
1600+
fileResponse.getFile().contains("http"), "File URL should be a valid HTTP URL");
1601+
1602+
System.out.println("✅ File uploaded successfully: " + fileResponse.getFile());
1603+
} finally {
1604+
// Clean up temp file
1605+
if (tempFile.exists()) {
1606+
tempFile.delete();
1607+
}
1608+
}
1609+
}
1610+
15421611
// =================================================================
15431612
// HELPER METHODS
15441613
// =================================================================

0 commit comments

Comments
 (0)