簡體   English   中英

上傳文件時使用HttpUrlConnection時出錯

[英]Getting error when upload file used HttpUrlConnection

我有一個Android應用程序和我的魔杖從這個應用程序上傳,大圖像(在這種情況下32MB)到Spring Server,但我得到java.net.SocketException:sendto失敗:EPIPE(斷管)錯誤。

我用這個方法:

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();
    }
}

params: userpicturehavePicture是我想用大圖像發送json的一些對象,這種方法適用於小於1MB的小圖像。

這里剩下的方法:

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 failed:在java.net.PlainSocketImpl上的libcore.io.IoBridge.sendto(IoBridge.java:555)的libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:586)上的EPIPE(Broken pipe) .write(PlainSocketImpl.java:520)at java.net.PlainSocketImpl.access $ 100(PlainSocketImpl.java:43)at java.net.PlainSocketImpl $ PlainSocketOutputStream.write(PlainSocketImpl.java:272)at com.android.okio.Okio com.android.okhttp上com.android.okio.RealBufferedSink.write(RealBufferedSink.java:44)的com.android.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:116)$ 1.write(Okio.java:70) .internal.http.HttpConnection $ ChunkedSink.write(HttpConnection.java:334)at com.android.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:116)at com.android.okio.RealBufferedSink $ 1.write(RealBufferedSink.java: 131)com.mayan.ameritrade.android.tools.Server $ override.addFilePart(Server.java:435)at com.mayan.ameritrade.android.tools.Server $ override.access $ dispatch(Server.java) at com.mayan.ameritrade.android.tools.Server.addFilePart(Server.java:0)at java.lang.reflect.Method.invoke(Native Method)at java.lang.reflect.Method.invoke(Method.java: 372)在com.mayan.amenidrade.android.tools.Server $ override.setPicture(Server.java:363)com.mayan的com.android.tools.fd.runtime.AndroidInstantRuntime.invokeProtectedStaticMethod(AndroidInstantRuntime.java:170) .ameritrade.android.tools.Server $ override.access $ dispatch(Server.java)at com.mayan.ameritrade.android.tools.Server.setPicture(Server.java:0)at com.mayan.ameritrade.android.MainActivity java.lang.Thread.run上的$ 2 $ 1.run(MainActivity.java:99)(Thread.java:818)引起:android.system.ErrnoException:sendto failed:libcore.io.Posix中的EPIPE(Broken pipe)。發送到libcore.io.Posix.sendto(Posix.java:206)的libto.io.BlockGuardOs.sendto(BlockGuardOs.java:278)的libto.io.IoBridge.sendto(IoBridge.java:553)的sendtoBytes(Native Method) ......還有20個

我現在不做該做什么,謝謝你的幫助!

你無法使用PrintWriter上傳圖片......你不...但......

PrintWriter僅用於文本。

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

您應該只寫一種類型的流。

我的問題解決了! 感謝@Randyka Yudhistira和@greenapps的幫助,我的問題是客戶端的一些不必要的代碼,主要是我的Spring服務器無法上傳大文件

添加inserver端:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSizePerFile">yourMaxSizeToUpload</property>
</bean>

要么

@Bean
public CommonsMultipartResolver getCommonsMultipartResolver() {
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    resolver.setMaxUploadSize(yourMaxSizeToUpload);
    return resolver;
}

如果這不起作用嘗試刪除不必要的代碼,如:

writer.append("Content-length: "+inputStream.available()).append(LINE_FEED);

在我的情況下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM