Java 通过 HTTP POST 上传文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20941708/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 05:27:36  来源:igfitidea点击:

Upload file by HTTP POST

javaresthttp-postmultipartentity

提问by The Nomad

I want to upload a file (an image specifically) to a REST Server using HTTP POST. I have already imported/add to build path httpmime-4.3.1.jarand apache-mime4j-0.6.jar. And I am getting the follow errors below in the Stack Trace.

我想使用HTTP POST. 我已经导入/添加到构建路径httpmime-4.3.1.jarapache-mime4j-0.6.jar. 我在堆栈跟踪中收到以下错误。

Is this valid? post.setHeader("enctype", "multipart/form-data");

这是有效的吗? post.setHeader("enctype", "multipart/form-data");

HTTP POST Code

HTTP POST 代码

public void multiPartPost() throws ClientProtocolException, IOException {
    File image = new File(EXTERNALSTORAGE + "/Pictures/sample.jpg");
    FileBody fileBody = new FileBody(image);

    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(url);
    post.setHeader("enctype", "multipart/form-data");

    MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
    multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    multipartEntity.addPart("sampleImage", fileBody);
    post.setEntity(multipartEntity.build());

    HttpResponse response = client.execute(post);
    String responseBody = EntityUtils.toString(response.getEntity());
    Log.v("multiPartPost HTTP Response", responseBody);
}

Stack Trace

堆栈跟踪

01-05 17:41:25.470: W/dalvikvm(6564): VFY: unable to resolve static field 1755 (DEFAULT_BINARY) in Lorg/apache/http/entity/ContentType;
01-05 17:41:25.470: D/dalvikvm(6564): VFY: replacing opcode 0x62 at 0x0000
01-05 17:41:25.470: I/dalvikvm(6564): Could not find method org.apache.http.entity.ContentType.create, referenced from method org.apache.http.entity.mime.content.FileBody.<init>
01-05 17:41:25.470: W/dalvikvm(6564): VFY: unable to resolve static method 6613: Lorg/apache/http/entity/ContentType;.create (Ljava/lang/String;)Lorg/apache/http/entity/ContentType;
01-05 17:41:25.470: D/dalvikvm(6564): VFY: replacing opcode 0x71 at 0x0000
01-05 17:41:25.470: I/dalvikvm(6564): Could not find method org.apache.http.entity.ContentType.create, referenced from method org.apache.http.entity.mime.content.FileBody.<init>
01-05 17:41:25.470: W/dalvikvm(6564): VFY: unable to resolve static method 6614: Lorg/apache/http/entity/ContentType;.create (Ljava/lang/String;Ljava/lang/String;)Lorg/apache/http/entity/ContentType;
01-05 17:41:25.470: D/dalvikvm(6564): VFY: replacing opcode 0x71 at 0x0000
01-05 17:41:25.470: W/dalvikvm(6564): VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;)
01-05 17:41:25.470: W/dalvikvm(6564): VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;)
01-05 17:41:25.478: W/dalvikvm(6564): VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;)
01-05 17:41:25.478: W/dalvikvm(6564): VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;)
01-05 17:41:25.478: I/dalvikvm(6564): Could not find method org.apache.http.util.Args.notNull, referenced from method org.apache.http.entity.mime.content.FileBody.<init>
01-05 17:41:25.478: W/dalvikvm(6564): VFY: unable to resolve static method 6808: Lorg/apache/http/util/Args;.notNull (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
01-05 17:41:25.478: D/dalvikvm(6564): VFY: replacing opcode 0x71 at 0x0005
01-05 17:41:25.478: I/dalvikvm(6564): Could not find method org.apache.http.util.Args.notNull, referenced from method org.apache.http.entity.mime.content.FileBody.writeTo
01-05 17:41:25.478: W/dalvikvm(6564): VFY: unable to resolve static method 6808: Lorg/apache/http/util/Args;.notNull (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
01-05 17:41:25.478: D/dalvikvm(6564): VFY: replacing opcode 0x71 at 0x0002
01-05 17:41:25.478: I/dalvikvm(6564): Could not find method org.apache.http.entity.ContentType.parse, referenced from method org.apache.http.entity.mime.content.AbstractContentBody.<init>
01-05 17:41:25.478: W/dalvikvm(6564): VFY: unable to resolve static method 6618: Lorg/apache/http/entity/ContentType;.parse (Ljava/lang/String;)Lorg/apache/http/entity/ContentType;
01-05 17:41:25.486: D/dalvikvm(6564): VFY: replacing opcode 0x71 at 0x0000
01-05 17:41:25.486: W/dalvikvm(6564): VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;)
01-05 17:41:25.486: I/dalvikvm(6564): Could not find method org.apache.http.util.Args.notNull, referenced from method org.apache.http.entity.mime.content.AbstractContentBody.<init>
01-05 17:41:25.486: W/dalvikvm(6564): VFY: unable to resolve static method 6808: Lorg/apache/http/util/Args;.notNull (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
01-05 17:41:25.486: D/dalvikvm(6564): VFY: replacing opcode 0x71 at 0x0005
01-05 17:41:25.486: I/dalvikvm(6564): Could not find method org.apache.http.entity.ContentType.getCharset, referenced from method org.apache.http.entity.mime.content.AbstractContentBody.getCharset
01-05 17:41:25.486: W/dalvikvm(6564): VFY: unable to resolve virtual method 6616: Lorg/apache/http/entity/ContentType;.getCharset ()Ljava/nio/charset/Charset;
01-05 17:41:25.486: D/dalvikvm(6564): VFY: replacing opcode 0x6e at 0x0002
01-05 17:41:25.486: W/dalvikvm(6564): VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;)
01-05 17:41:25.486: I/dalvikvm(6564): Could not find method org.apache.http.entity.ContentType.getMimeType, referenced from method org.apache.http.entity.mime.content.AbstractContentBody.getMediaType
01-05 17:41:25.486: W/dalvikvm(6564): VFY: unable to resolve virtual method 6617: Lorg/apache/http/entity/ContentType;.getMimeType ()Ljava/lang/String;
01-05 17:41:25.486: D/dalvikvm(6564): VFY: replacing opcode 0x6e at 0x0002
01-05 17:41:25.493: I/dalvikvm(6564): Could not find method org.apache.http.entity.ContentType.getMimeType, referenced from method org.apache.http.entity.mime.content.AbstractContentBody.getMimeType
01-05 17:41:25.493: W/dalvikvm(6564): VFY: unable to resolve virtual method 6617: Lorg/apache/http/entity/ContentType;.getMimeType ()Ljava/lang/String;
01-05 17:41:25.493: D/dalvikvm(6564): VFY: replacing opcode 0x6e at 0x0002
01-05 17:41:25.493: I/dalvikvm(6564): Could not find method org.apache.http.entity.ContentType.getMimeType, referenced from method org.apache.http.entity.mime.content.AbstractContentBody.getSubType
01-05 17:41:25.493: W/dalvikvm(6564): VFY: unable to resolve virtual method 6617: Lorg/apache/http/entity/ContentType;.getMimeType ()Ljava/lang/String;
01-05 17:41:25.493: D/dalvikvm(6564): VFY: replacing opcode 0x6e at 0x0002
01-05 17:41:25.493: W/dalvikvm(6564): threadid=11: thread exiting with uncaught exception (group=0x40dc51f8)
01-05 17:41:25.501: E/AndroidRuntime(6564): FATAL EXCEPTION: AsyncTask #1
01-05 17:41:25.501: E/AndroidRuntime(6564): java.lang.RuntimeException: An error occured while executing doInBackground()
01-05 17:41:25.501: E/AndroidRuntime(6564):     at android.os.AsyncTask.done(AsyncTask.java:287)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:217)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at java.lang.Thread.run(Thread.java:856)
01-05 17:41:25.501: E/AndroidRuntime(6564): Caused by: java.lang.NoClassDefFoundError: org.apache.http.entity.ContentType
01-05 17:41:25.501: E/AndroidRuntime(6564):     at org.apache.http.entity.mime.content.FileBody.<init>(FileBody.java:89)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at com.medusa.checkit.HTTPPostRequest.multiPartPost(HTTPPostRequest.java:79)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at com.medusa.checkit.MenuActivity$BackgroundTask.doInBackground(MenuActivity.java:79)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at com.medusa.checkit.MenuActivity$BackgroundTask.doInBackground(MenuActivity.java:1)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at android.os.AsyncTask.call(AsyncTask.java:273)
01-05 17:41:25.501: E/AndroidRuntime(6564):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-05 17:41:25.501: E/AndroidRuntime(6564):     ... 5 more

采纳答案by MadProgrammer

You seem to be missing a dependency.

您似乎缺少依赖项。

I have httpclient-4.2.5, httpcleint-cache-4.2.5, httpcore-4.2.4and httpmime-4.2.5with commons-lang3-3.1and commons-logging-1.1.2jars in my class path.

我的类路径中有httpclient-4.2.5, httpcleint-cache-4.2.5,httpcore-4.2.4httpmime-4.2.5withcommons-lang3-3.1commons-logging-1.1.2jars 。

I also use entity.addPart(formFieldName, new FileBody(file, "image/jpeg"));instead of using the header property.

我也使用entity.addPart(formFieldName, new FileBody(file, "image/jpeg"));而不是使用 header 属性。

Take a look at Internet media typefor more details

查看互联网媒体类型了解更多详情