fixed issue for desktop when sending a file too large
This commit is contained in:
@@ -4,7 +4,10 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||||
import org.example.petshopdesktop.auth.UserSession;
|
import org.example.petshopdesktop.auth.UserSession;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.SequenceInputStream;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.http.HttpClient;
|
import java.net.http.HttpClient;
|
||||||
import java.net.http.HttpRequest;
|
import java.net.http.HttpRequest;
|
||||||
@@ -150,26 +153,33 @@ public class ApiClient {
|
|||||||
String mimeType = Files.probeContentType(filePath);
|
String mimeType = Files.probeContentType(filePath);
|
||||||
if (mimeType == null || mimeType.isBlank()) mimeType = "application/octet-stream";
|
if (mimeType == null || mimeType.isBlank()) mimeType = "application/octet-stream";
|
||||||
|
|
||||||
byte[] fileBytes = Files.readAllBytes(filePath);
|
|
||||||
String fileName = filePath.getFileName().toString();
|
String fileName = filePath.getFileName().toString();
|
||||||
|
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
byte[] fileHeader = ("--" + boundary + "\r\nContent-Disposition: form-data; name=\"" + filePartName
|
||||||
out.write(("--" + boundary + "\r\nContent-Disposition: form-data; name=\"" + filePartName
|
|
||||||
+ "\"; filename=\"" + fileName + "\"\r\nContent-Type: " + mimeType + "\r\n\r\n")
|
+ "\"; filename=\"" + fileName + "\"\r\nContent-Type: " + mimeType + "\r\n\r\n")
|
||||||
.getBytes(StandardCharsets.UTF_8));
|
.getBytes(StandardCharsets.UTF_8);
|
||||||
out.write(fileBytes);
|
|
||||||
out.write("\r\n".getBytes(StandardCharsets.UTF_8));
|
ByteArrayOutputStream tail = new ByteArrayOutputStream();
|
||||||
|
tail.write("\r\n".getBytes(StandardCharsets.UTF_8));
|
||||||
if (textContent != null && !textContent.isBlank()) {
|
if (textContent != null && !textContent.isBlank()) {
|
||||||
out.write(("--" + boundary + "\r\nContent-Disposition: form-data; name=\"" + textPartName
|
tail.write(("--" + boundary + "\r\nContent-Disposition: form-data; name=\"" + textPartName
|
||||||
+ "\"\r\n\r\n" + textContent + "\r\n").getBytes(StandardCharsets.UTF_8));
|
+ "\"\r\n\r\n" + textContent + "\r\n").getBytes(StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
out.write(("--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8));
|
tail.write(("--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8));
|
||||||
|
|
||||||
|
InputStream body = new SequenceInputStream(
|
||||||
|
java.util.Collections.enumeration(java.util.Arrays.asList(
|
||||||
|
new ByteArrayInputStream(fileHeader),
|
||||||
|
Files.newInputStream(filePath),
|
||||||
|
new ByteArrayInputStream(tail.toByteArray())
|
||||||
|
))
|
||||||
|
);
|
||||||
|
|
||||||
HttpRequest.Builder builder = HttpRequest.newBuilder()
|
HttpRequest.Builder builder = HttpRequest.newBuilder()
|
||||||
.uri(URI.create(baseUrl + path))
|
.uri(URI.create(baseUrl + path))
|
||||||
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
|
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
|
||||||
.POST(HttpRequest.BodyPublishers.ofByteArray(out.toByteArray()))
|
.POST(HttpRequest.BodyPublishers.ofInputStream(() -> body))
|
||||||
.timeout(Duration.ofSeconds(30));
|
.timeout(Duration.ofSeconds(120));
|
||||||
addAuthHeader(builder);
|
addAuthHeader(builder);
|
||||||
HttpResponse<String> response = httpClient.send(builder.build(), HttpResponse.BodyHandlers.ofString());
|
HttpResponse<String> response = httpClient.send(builder.build(), HttpResponse.BodyHandlers.ofString());
|
||||||
return handleResponse(response, responseClass);
|
return handleResponse(response, responseClass);
|
||||||
|
|||||||
@@ -204,11 +204,18 @@ public class ChatController {
|
|||||||
}
|
}
|
||||||
lblChatStatus.setText("Message sent");
|
lblChatStatus.setText("Message sent");
|
||||||
});
|
});
|
||||||
|
} catch (OutOfMemoryError e) {
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
txtMessage.setText(content);
|
||||||
|
btnSend.setDisable(false);
|
||||||
|
lblChatStatus.setText("File too large to send");
|
||||||
|
});
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
txtMessage.setText(content);
|
txtMessage.setText(content);
|
||||||
btnSend.setDisable(false);
|
btnSend.setDisable(false);
|
||||||
lblChatStatus.setText("Chat send failed");
|
String msg = e.getMessage();
|
||||||
|
lblChatStatus.setText(msg != null && !msg.isBlank() ? msg : "Chat send failed");
|
||||||
ActivityLogger.getInstance().logException(
|
ActivityLogger.getInstance().logException(
|
||||||
"ChatController.sendMessage",
|
"ChatController.sendMessage",
|
||||||
e,
|
e,
|
||||||
@@ -223,6 +230,16 @@ public class ChatController {
|
|||||||
File file = org.example.petshopdesktop.util.FilePickerSupport.pickAnyFile(btnAttachment.getScene().getWindow());
|
File file = org.example.petshopdesktop.util.FilePickerSupport.pickAnyFile(btnAttachment.getScene().getWindow());
|
||||||
if (file == null) return;
|
if (file == null) return;
|
||||||
|
|
||||||
|
long maxBytes = 5 * 1024 * 1024;
|
||||||
|
if (file.length() > maxBytes) {
|
||||||
|
javafx.scene.control.Alert alert = new javafx.scene.control.Alert(javafx.scene.control.Alert.AlertType.WARNING);
|
||||||
|
alert.setTitle("File Too Large");
|
||||||
|
alert.setHeaderText("The selected file exceeds the 5 MB limit.");
|
||||||
|
alert.setContentText("Please choose a smaller file and try again.");
|
||||||
|
alert.showAndWait();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
selectedAttachmentFile = file;
|
selectedAttachmentFile = file;
|
||||||
btnAttachment.setText("📎 " + file.getName());
|
btnAttachment.setText("📎 " + file.getName());
|
||||||
btnAttachment.setStyle("-fx-background-color: #dcfce7; -fx-background-radius: 12; -fx-text-fill: #166534; -fx-cursor: hand;");
|
btnAttachment.setStyle("-fx-background-color: #dcfce7; -fx-background-radius: 12; -fx-text-fill: #166534; -fx-cursor: hand;");
|
||||||
|
|||||||
Reference in New Issue
Block a user