Multipart / form-data Строка файла изображения - PullRequest
0 голосов
/ 29 мая 2020

У меня есть лямбда-функция, которая обрабатывает загруженный файл изображения. Он получает строку в кодировке 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, поскольку содержимое изображения не совсем то же самое, когда я декодирую его обратно, возможно, из-за дополнительных новых строка или пробелы.

Пожалуйста, помогите. Спасибо

...