![](/img/trans.png)
[英]Android Multipart File Upload using HttpURLConnection - 400 Bad Request Error
[英]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: user
, picture
和havePicture
是我想用大圖像發送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.