Java - архив gz, загруженный как поток октетов - PullRequest
0 голосов
/ 03 октября 2018

Я столкнулся с проблемой при загрузке файла gzip и сохранении его в файловой системе с Java 5. После завершения загрузки файл (который имеет правильное имя и расширение) отображается каку меня другой тип MIME ... Я не могу разархивировать его с моего Linux-сервера (используя gunzip), и если я пытаюсь открыть его с помощью WinZip на моем ПК с Windows, я вижу «рекурсивный» архив (например, куклу матрешки)).Если я наберу команду file *filename*.gz с сервера, она распознает файл как ascii text.Вместо этого, если я пытаюсь загрузить архив с помощью браузера, все идет хорошо, и я могу правильно открыть и разархивировать файл (даже с моим сервером Linux), и теперь он распознается как gzip compressed archive.

Воткод, который я использую для загрузки и сохранения файла.

Main.java:

public class Main {

public static void main(String[] args) {

    String filePath = "";
    HttpOutgoingCall httpOngoingCall = null;
    httpOngoingCall = new HttpOutgoingCall();
    String endpointUrl = "https://myurl/myfile.gz";
    try {

        InputStream inputStream = httpOngoingCall.callHttps(endpointUrl);
        //I also tried with ZipInputStream and GZIPInputStream

        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

        filePath = parseAndWriteResponse(br, "myfile.gz", "C:\\");

        System.out.println(filePath);

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}


private static String parseAndWriteResponse(BufferedReader br, String fileName,
                                     String destPath) {
    String outputFileName = null;

    outputFileName = destPath + File.separator + fileName;

    String line;
    File outputFile = new File(outputFileName);
    FileWriter fileWriter = null;
    BufferedWriter bw = null;

    try {
        if (!outputFile.exists()) {
            outputFile.createNewFile();
        }
    } catch (IOException e1) {

    }

    try {
        fileWriter = new FileWriter(outputFile);
        bw = new BufferedWriter(fileWriter);
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.write("\n");
        }
    } catch (IOException e) {

    } finally {
        try {
            bw.close();
            fileWriter.close();
        } catch (IOException e) {

        }
    }
    return outputFileName;
}

HttpOutgoingCall.java:

public class HttpOutgoingCall {

private InputStream inStream = null;

private HttpsURLConnection httpsConnection = null;


private final static int CONNECTION_TIMEOUT = 20000;


public InputStream callHttps(String endpointUrl) throws Exception {

    String socksServer = "";
    String socksPort = "";

    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

    Properties properties = System.getProperties();

    System.setProperty("java.protocol.handler.pkgs", "javax.net.ssl");
    java.security.Security
            .addProvider(new com.sun.net.ssl.internal.ssl.Provider());

    if (!socksServer.equals("")) {
        if (System.getProperty("socksProxyHost") == null) {
            properties.put("socksProxyHost", socksServer);
        }
        if (!socksPort.equals("")) {
            if (System.getProperty("socksProxyPort") == null) {
                properties.put("socksProxyPort", socksPort);
            }
        }
    }
    System.setProperties(properties); 

    System.setProperty("java.protocol.handler.pkgs", "javax.net.ssl");
    java.security.Security
            .addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {

            return null;
        }

        public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {
        }

        public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {
        }
    } };

    try {
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection
                .setDefaultSSLSocketFactory(sc.getSocketFactory());

        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                return true;
            }
        };

        HttpsURLConnection.setDefaultHostnameVerifier(hv);

        httpsConnection = (HttpsURLConnection) (new URL(endpointUrl)).openConnection();

        httpsConnection.setDoOutput(true);
        httpsConnection.setUseCaches(false);

        httpsConnection.setConnectTimeout(CONNECTION_TIMEOUT);
        httpsConnection.setReadTimeout(CONNECTION_TIMEOUT);

        inStream = httpsConnection.getInputStream();

    } catch (Exception e) {}

    return inStream;
}

Может ли кто-нибудь мне помочь?Спасибо!

1 Ответ

0 голосов
/ 03 октября 2018

При записи файла вы должны отправить его через java.util.zip.GZIPOutputStream.

...