Java: получение имени загруженного вложенного файла (HttpClient, PostMethod) - PullRequest
2 голосов
/ 11 февраля 2012

Я звоню в службу SOAP, которая возвращает мне сохраненный файл (см. Код ниже).Я хотел бы сохранить его, используя исходное имя файла, которое сервер отправляет мне.Как вы можете видеть, я просто жестко кодирую имя файла, в котором сохраняю поток.

def payload = """
<SOAP-ENV:Body><mns1:getFile xmlns:mns1="http://connect.com/">
 <userLogicalId>${params.userLogicalId}</userLogicalId>
 <clientLogicalId>${params.clientLogicalId}</clientLogicalId>

def client = new HttpClient()

def statusCode = client.executeMethod(method)
InputStream handler = method.getResponseBodyAsStream()

//TODO:  The new File(... has filename hard coded).
OutputStream outStr = new FileOutputStream(new File("c:\\var\\nfile.zip"))

byte[] buf = new byte[1024]
int len
while ((len = handler.read(buf)) > 0) {
    outStr.write(buf, 0, len);
}
handler.close();
outStr.close();

Итак, я хочу получить имя файла вответ.Спасибо.

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

В заголовках ответа установите Content-Disposition на "attachment; filename=\"" + fileName + "\""

1 голос
/ 11 февраля 2012

Если у вас есть контроль над API, который отправляет файл, вы можете убедиться, что API устанавливает правильный заголовок расположения содержимого .Затем в коде, где вы получаете файл, вы можете прочитать заголовок расположения содержимого и найти исходное имя файла из него.

Вот код, заимствованный из файла fileonsload, который считывает имя файла из заголовка расположения содержимого.

private String getFileName(String pContentDisposition) {
        String fileName = null;
        if (pContentDisposition != null) {
            String cdl = pContentDisposition.toLowerCase();
            if (cdl.startsWith(FORM_DATA) || cdl.startsWith(ATTACHMENT)) {
                ParameterParser parser = new ParameterParser();
                parser.setLowerCaseNames(true);
                // Parameter parser can handle null input
                Map params = parser.parse(pContentDisposition, ';');
                if (params.containsKey("filename")) {
                    fileName = (String) params.get("filename");
                    if (fileName != null) {
                        fileName = fileName.trim();
                    } else {
                        // Even if there is no value, the parameter is present,
                        // so we return an empty file name rather than no file
                        // name.
                        fileName = "";
                    }
                }
            }
        }
        return fileName;
    }

Вам нужно прочитать заголовок размещения содержимого, а затем разделить его с помощью ";"сначала, а затем снова разделите каждый токен с помощью «=», чтобы получить пары «имя-значение».

0 голосов
/ 21 октября 2016

Вы можете использовать Content-Disposition Header для определения и сохранения соответственно.

int index = dispositionValue.indexOf("filename=");
if (index > 0) {
    filename = dispositionValue.substring(index + 10, dispositionValue.length() - 1);
}
System.out.println("Downloading file: " + filename);

Полный код приведен ниже с использованием Apache HttpComponents http://hc.apache.org

public static void main(String[] args) throws ClientProtocolException, IOException {

    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet(
            "http://someurl.com");
    CloseableHttpResponse response = httpclient.execute(httpGet);

    try {
        System.out.println(response.getStatusLine());
        HttpEntity entity = response.getEntity();
        System.out.println("----------------------------------------");
        System.out.println(entity.getContentType());
        System.out.println(response.getFirstHeader("Content-Disposition").getValue());

        InputStream input = null;
        OutputStream output = null;
        byte[] buffer = new byte[1024];

        try {
            String filename = "test.tif";
            String dispositionValue = response.getFirstHeader("Content-Disposition").getValue();
            int index = dispositionValue.indexOf("filename=");
            if (index > 0) {
                filename = dispositionValue.substring(index + 10, dispositionValue.length() - 1);
            }
            System.out.println("Downloading file: " + filename);
            input = entity.getContent();
            String saveDir = "c:/temp/";

            output = new FileOutputStream(saveDir + filename);
            for (int length; (length = input.read(buffer)) > 0;) {
                output.write(buffer, 0, length);
            }
            System.out.println("File successfully downloaded!");
        } finally {
            if (output != null)
                try {
                    output.close();
                } catch (IOException logOrIgnore) {
                }
            if (input != null)
                try {
                    input.close();
                } catch (IOException logOrIgnore) {
                }
        }
        EntityUtils.consume(entity);
    } finally {
        response.close();
        System.out.println(executeTime);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...