当前位置: 首页 > 知识库问答 >
问题:

使用HttpUrlConnection上传文件时获取错误

黄弘盛
2023-03-14
public static void setPicture(User user, Picture picture, HavePicture havePicture, File file) {
    try {
        URL url = new URL(Request.BASE_URL + Request.BASE_PATH + Request.GAME_SYSTEM_PATH + Request.SET_PICTURE_PATH);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setUseCaches(false);
        connection.setDoOutput(true); // indicates POST method
        connection.setDoInput(true);
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        connection.setRequestProperty("User-Agent", "CodeJava Agent");
        connection.setRequestProperty("Test", "Bonjour");

        //load file with multi small pices not one lage pice good to use large filse
        connection.setChunkedStreamingMode(1024);

        OutputStream outputStream = connection.getOutputStream();
        PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, Request.CHARSET), true);

        addFormField(writer, Request.PARAM_USER, Json.toJson(user));
        addFormField(writer, Request.PARAM_PICTURE, Json.toJson(picture));
        addFormField(writer, Request.PARAM_HAVE_PICTURE, Json.toJson(havePicture));
        addFilePart(writer, outputStream, Request.PARAM_FILE, file);

        StringBuffer response = new StringBuffer();

        writer.append(LINE_FEED).flush();
        writer.append("--" + boundary + "--").append(LINE_FEED);
        writer.close();
        // checks server's status code first
        int status = connection.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
            connection.disconnect();
        } else {
            throw new IOException("Server returned non-OK status: " + status);
        }

        String a =  response.toString();
        System.out.println(a);

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
private static void addFormField(PrintWriter writer, String name, String value) {
    writer.append("--" + boundary).append(LINE_FEED);
    writer.append("Content-Disposition: form-data; name=\"" + name + "\"").append(LINE_FEED);
    writer.append("Content-Type: text/plain; charset=" + Request.CHARSET).append(LINE_FEED);
    writer.append(LINE_FEED);
    writer.append(value).append(LINE_FEED);
    writer.flush();
}

用于图像文件:

private static void addFilePart(PrintWriter writer,OutputStream outputStream, 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("Content-Transfer-Encoding: binary").append(LINE_FEED);

    FileInputStream inputStream = new FileInputStream(uploadFile);

    writer.append("Content-length: "+inputStream.available()).append(LINE_FEED);
    System.out.println("- - "+"Content-length: "+inputStream.available());
    writer.append(LINE_FEED);
    writer.flush();


    byte[] buffer = new byte[4096];
    int bytesRead = -1;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
    }
    outputStream.flush();
    inputStream.close();

    writer.append(LINE_FEED);
    writer.flush();
}

以下是我完成的错误:

java.net.socketException:sendto失败:在libcore.io.iobridge.MaybeThrowAfterSendto(Iobridge.java:586)在libcore.io.iobridge.sendto(Iobridge.java:555)在java.net.plainsockeTimpl.write(plainsockeTimpl.java:520)在java.net.plainsockeTimpl.access$100(plainsockeTimpl.java:43)在:70)在com.android.okio.realBufferedSink.emitCompleteSegments(realBufferedSink.java:116)在com.android.okkio.realBufferedSink.write(realBufferedSink.java:44)在com.android.okhttp.internal.http.httpConnection$chunkedSink.write(httpConnection.java:334)在com.android.okio.realBufferedSink.emitCompleteSegments s.server$override.addFilePart(server.java:435)位于com.mayan.ameritrade.android.tools.server$override.access$dispatch(server.java)在com.mayan.ameritrade.android.tools.server.addfilePart(server.java:0)在java.lang.reflect.Method.invoke(原生方法)在java.lang.reflect.Method.invoke(Method.java:372)在com.android.tools.fd.runtime.androidInstantruntime.invokeProtectedStaticMethod(androidInstantruntime.java:170)在在com.mayan.ameritrade.android.mainactivity$2$1.run(mainactivity.java:99)在java.lang.thread.run(thread.java:818)由:android.system.errnoException:sendto failed:EPIPE(breaked pipe)在libcore.io.posix.sendto(Native methods)在libcore.io.blockguardos.sendto(posix.java:206)在

我现在不想做什么,谢谢你的帮助!

共有1个答案

傅乐湛
2023-03-14

不能使用PrintWriter上载图像。..你不...但是...

PrintWriter只用于文本。

您正在混合PrintWriter和正常的OutputStream。那不行。

 类似资料:
  • 我正在尝试使用HttpURLConnection通过http url发送XML。

  • 我编写了一个java程序来从url NSE Bhavcopy下载文件 但是我得到了“thread'main'java.net.ConnectException:Connection timed Ut:Connect”,我尝试了以下排列和组合,但没有成功。 null 以下是代码和跟踪以供参考,有人可以帮助我吗 痕迹

  • 我使用可恢复上传任何大小的文件上传。如果我在上传文件时遇到任何问题,我会等待指数退避,然后询问当前上传会话的字节范围,然后从最后上传的字节继续。这个过程最多重复5次。如果文件最终没有上传成功,我会在日志中写入一个错误。 不幸的是,我没有记录所有的中间错误,所以我只知道最后一个错误是“410,description:Internal error”。 该文件小于1KB,在记录错误之前,整个过程大约花了

  • 问题内容: 我正在使用Java Web Application中的生成报告。 我有以下一行来获取报告文件。 但是当我尝试使用上面的线时,我得到了。但是当我尝试使用以下行时,程序成功执行。 所以,我想知道第一行的问题是什么? 提前致谢… 问题答案: 您提供的路径应该是servlet路径。通常,servlet路径具有正斜杠。 请尝试一下。

  • 我想上传一个图像文件。当我调用我的API上传文件使用postman,得到的错误,如. 我无法将此文件发布到我的Laravel控制器。如何在Laravel中发布文件。有人能帮我解决这个问题吗? 这是我的控制器功能, 在这一行

  • 我在使用HTTPUrlConnection时遇到了一些问题。代码基本上是在循环中运行的,每次都连接到不同的URL,检查响应,如果响应满足某些条件,则退出。我被StackOverflowerr搞砸了,但我不确定自己搞砸了什么。我没有使用