Публикация многочастной формы с помощью inputtream, а не файла в Java - PullRequest
0 голосов
/ 07 ноября 2019

Я хотел бы опубликовать данные в формате CSV на внешний URL-адрес. URL-адрес требует составной формы, содержащей строку и файл. Мне кажется, что это требует сохранения файла на диск, прежде чем я могу вызвать URL. Можно ли использовать этот URL (это служба геокодирования Бюро переписи населения США) без сохранения файла на диск? Например, могу ли я использовать ByteArrayInputStream, который только временно живет в памяти? Ниже приведен мой исходный код, который включает в себя сохранение файла на диск.

        String benchmark = "9";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost uploadFile = new HttpPost("https://geocoding.geo.census.gov/geocoder/locations/addressbatch");
        MultipartEntityBuilder builder2 = MultipartEntityBuilder.create();
        builder2.addTextBody("benchmark", benchmark, ContentType.TEXT_PLAIN);
        File f = new File("UscbGeocodingInput.csv");
        FileInputStream is = new FileInputStream(f);

        builder2.addBinaryBody(
                "addressFile",
                is,
                ContentType.APPLICATION_OCTET_STREAM,
                f.getName());

        HttpEntity multipart = builder2.build();
        uploadFile.setEntity(multipart);
        CloseableHttpResponse response = httpClient.execute(uploadFile);

Я не хочу сохранять файл на диск, потому что он должен существовать только временно, пока мы не вызовем внешний URL. Я попытался использовать входной поток байтового массива вместо F ileInputStream, но тогда запрос завершается неудачно с 400 error.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Это сработало ... Оказывается, API геокодирования Бюро переписи США ищет имя файла, оканчивающееся на '.csv'. Хотя я передаю байтовый массив, а не файл, вам все равно нужно дать имя этому входному потоку.

        String benchmark = "9";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost uploadFile = new HttpPost("https://geocoding.geo.census.gov/geocoder/locations/addressbatch");
        MultipartEntityBuilder builder2 = MultipartEntityBuilder.create();
        builder2.addTextBody("benchmark", benchmark, ContentType.TEXT_PLAIN);
        byte[] addressFileAsBytes = baos.toByteArray();
//      AnalyzeInputStream(is);

        builder2.addBinaryBody(
                "addressFile",
                addressFileAsBytes,
                ContentType.APPLICATION_OCTET_STREAM,
                "anyStringThatEndsInDotCSV.csv");
        HttpEntity multipart = builder2.build();
        uploadFile.setEntity(multipart);
        CloseableHttpResponse response = httpClient.execute(uploadFile);
        HttpEntity responseEntity = response.getEntity();
0 голосов
/ 07 ноября 2019

Могу ли я использовать ByteArrayInputStream?

Да, но зачем вам это делать, если существует перегрузка, которая принимает byte[] напрямую?

addBinaryBody(String name, byte[] b, ContentType contentType, String filename)

...