通过http基本身份验证(JAVA)上传文件时出现Java堆空间错误

时间:2016-05-19 23:57:26

标签: java file basic-authentication http-basic-authentication

我正在尝试使用以下代码通过https和基本身份验证上传文件。

 try {

    String CRLF = "\r\n";
    String charset = "UTF-8";
    File textFile = new File(path);

    String authString = name + ":" + password;
    byte[] authEncBytes = Base64.getEncoder().encode(authString.getBytes());
    String authStringEnc = new String(authEncBytes);
    String webPage = "https://....";//here I used the http link

        URL url = new URL(webPage);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
        String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
        urlConnection.setInstanceFollowRedirects( false );
        urlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

        OutputStream output = urlConnection.getOutputStream();
        PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
        writer.append("--" + boundary).append(CRLF);
        writer.append("Content-Disposition: form-data; name=\"user_id\"").append(CRLF);
        writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
        writer.append(CRLF).append(userid).append(CRLF).flush();
        writer.append("--" + boundary).append(CRLF);
        writer.append("Content-Disposition: form-data; name=\"newfile\"; filename=\"" + textFile.getName() + "\"").append(CRLF);
        writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); // Text file itself must be saved in this charset!
        writer.append(CRLF).flush();
        Files.copy(textFile.toPath(), output);//This is causing the error when uploading huge files
        output.flush(); // Important before continuing with writer!
        writer.append(CRLF).flush();
        writer.append("--" + boundary + "--").append(CRLF).flush();
        InputStream responseStream = new 
        BufferedInputStream(urlConnection.getInputStream());
        BufferedReader responseStreamReader = 
                        new BufferedReader(new InputStreamReader(responseStream));

        String line = "";
        StringBuilder stringBuilder = new StringBuilder();

        while ((line = responseStreamReader.readLine()) != null) {
                        stringBuilder.append(line).append("\n");
                        System.out.println(stringBuilder.append(line).append("\n"));
            }
        responseStreamReader.close();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) { }

当文件大小不大时工作正常。但是当大小很大时:800,000 KB就会给我这个错误:

       Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:78)
at java.nio.file.Files.copy(Files.java:2909)
at java.nio.file.Files.copy(Files.java:3069)

如何使用https基本身份验证上传大文件???

0 个答案:

没有答案