我正在尝试将图片上传到服务器。
以下是我在Android中编写的代码,用于将图像文件和其他一些参数一起发送到服务器:
static String imagePath = "/storage/sdcard0/Pictures/image.jpg";
static String url = "http://example.com/api";
static String user_id = "99401";
public static void executeMultipartPost() throws IOException, ClientProtocolException {
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpPost httppost = new HttpPost(url);
File file = new File(imagePath);
FileBody fb = new FileBody(file);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addPart("user_id", new StringBody(user_id));
builder.addPart("type", new StringBody("single"));
builder.addPart("userfile", fb);
final HttpEntity entity = builder.build();
httppost.setEntity(entity);
Log.i(TAG, "Executing request: " + httppost.getRequestLine());
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
Log.i(TAG, ""+response.getStatusLine());
if (resEntity != null) {
Log.i(TAG, EntityUtils.toString(resEntity));
}
if (resEntity != null) {
resEntity.consumeContent();
}
httpclient.getConnectionManager().shutdown();
}
一切正常,除非上传到服务器,服务器会收到空图片。我只能看到一个0字节的图像文件。我猜客户端代码中的某些内容未正确设置。
执行代码后我在Logcat中得到的响应是这样的(来自 Laravel 错误日志):
<html><h2>Unhandled Exception</h2>
<h3>Message:</h3>
<pre>copy(): The first argument to copy() function cannot be a directory</pre>
<h3>Location:</h3>
<pre>/home/ked.ai/www/laravel/file.php on line 92</pre>
<h3>Stack Trace:</h3>
<pre>#0 /home/ked.ai/www/laravel/laravel.php(42): Laravel\Error::native(2, 'copy(): The fir...', '/home/ked.ai/ww...', 92)
#1 [internal function]: Laravel\{closure}(2, 'copy(): The fir...', '/home/ked.ai/ww...', 92, Array)
#2 /home/ked.ai/www/laravel/file.php(92): copy('/', '/home/ked.ai/ww...')
#3 /home/ked.ai/www/application/controllers/api2/item.php(190): Laravel\File::copy('/', '/home/ked.ai/ww...')
#4 [internal function]: Api2_Item_Controller->post_new()
#5 /home/ked.ai/www/laravel/routing/controller.php(325): call_user_func_array(Array, Array)
#6 /home/ked.ai/www/laravel/routing/controller.php(285): Laravel\Routing\Controller->response('new', Array)
#7 /home/ked.ai/www/laravel/routing/controller.php(165): Laravel\Routing\Controller->execute('new', Array)
#8 /home/ked.ai/www/laravel/routing/route.php(153): Laravel\Routing\Controller::call('api2.item@new', Array)
#9 /home/ked.ai/www/laravel/routing/route.php(124): Laravel\Routing\Route->response()
#10 /home/ked.ai/www/laravel/laravel.php(167): Laravel\Routing\Route->call()
#11 /home/ked.ai/www/public/index.php(34): require('/home/ked.ai/ww...')
#12 {main}</pre></html>
它似乎传递了目录而不是文件。任何解决方法?
答案 0 :(得分:0)
您可以使用此方法将图像传递给php服务器。
答案 1 :(得分:0)
其工作代码:
public void executeMultipartPost() throws Exception {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bm.compress(CompressFormat.JPEG, 75, bos);
byte[] data = bos.toByteArray();
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(url_path);
ByteArrayBody bab = new ByteArrayBody(data, "forest.jpg");
// File file= new File("/mnt/sdcard/forest.png");
// FileBody bin = new FileBody(file);
MultipartEntity reqEntity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("file", bab);
reqEntity.addPart("category ", new StringBody("1"));
reqEntity.addPart("user_id ", new StringBody("55"));
postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
String my_response = convertStreamToString(response.getEntity()
.getContent());
Toast.makeText(getApplicationContext(), my_response,
Toast.LENGTH_LONG).show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
public static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
试试吧。
答案 2 :(得分:0)
我设法找到了解决方案。
我只需要改变这一行
builder.addPart("userfile", fb);
到
builder.addPart("userfile[]", fb);
因为在服务器端,$_FILES['userfile']
接收数组类型。
谢谢。