У меня есть лямбда-функция, которая обрабатывает загруженный файл изображения. Он получает строку в кодировке base64 из тела, проверяет файл и выполняет дальнейшую обработку.
import java.util.Base64;
import java.util.List;
import java.util.Map;
import org.apache.commons.fileupload.FileItem;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import delight.fileupload.FileUpload;
public class ImageUploadHandler implements RequestHandler<Map<String, String>, UploadResponse> {
private ImageHandlerService imageHandlerService = new ImageHandlerService();
public UploadResponse handleRequest(Map<String, String> event, Context context) {
byte[] body = Base64.getDecoder().decode(event.get("body").toString());
String contentType = event.get("content-type").toString();
List<FileItem> items = FileUpload.parse(body, contentType);
UploadResponse uploadResponse = imageHandlerService.processImageUploadReq(items);
return uploadResponse;
}
}
Я хочу протестировать этот метод в своей системе, не нажимая AWS API, создав запрос multipart / form-data , т.е. в основном для создания строки в кодировке base64.
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLConnection;
import java.util.Base64;
public class MultiPartBuilder {
private static StringBuilder writer = new StringBuilder();
private String boundary;
private static final String LINE_FEED = "\r\n";
private String contentType;
public MultiPartBuilder() {
boundary = "--------------------------109887091570345543171986";
contentType = "multipart/form-data; boundary=" + boundary;
}
public void addFormField(String name, String value) {
writer.append("--" + boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name=\"" + name + "\"").append(LINE_FEED);
writer.append(LINE_FEED);
writer.append(value);
}
public void addFilePart(String fieldName, File uploadFile) throws IOException {
String fileName = uploadFile.getName();
writer.append("--" + boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name=\"" + fieldName + "\"; filename=\"" + fileName + "\"")
.append(LINE_FEED);
writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(fileName)).append(LINE_FEED);
writer.append(LINE_FEED);
FileInputStream inputStream = new FileInputStream(uploadFile);
byte[] buffer = new byte[4096];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
String fileData = outputStream.toString();
writer.append(fileData);
outputStream.flush();
inputStream.close();
writer.append(LINE_FEED);
}
public String finish() {
writer.append(LINE_FEED);
writer.append("--" + boundary + "--").append(LINE_FEED);
return writer.toString();
}
public static void main(String[] args) throws Exception {
MultiPartBuilder mp = new MultiPartBuilder();
File f = new File("PATH/jungle.jpeg");
mp.addFormField("userid", "u1ser03");
mp.addFilePart("photo", f);
String fileString = mp.finish();
byte[] bytesEncoded = Base64.getEncoder().encode(fileString.getBytes());
System.out.println("encoded value is " + new String(bytesEncoded));
}
}
Это дает мне другое значение для того же файла jpeg, поскольку содержимое изображения не совсем то же самое, когда я декодирую его обратно, возможно, из-за дополнительных новых строка или пробелы.
Пожалуйста, помогите. Спасибо