我已经阅读了很多关于从Android应用程序和内容类型向服务器发送图像的帖子,它们分为三类:
a)他们根本不设置内容类型,可能以某种方式设置代码
b)他们使用弃用的方法
c)他们使用的方法与我选择的完全不同。我想将文件发送到服务器并将其存储在一个文件夹中。
我的代码是一个完整的拼凑,一个屠宰工作,我在阅读了很多帖子和文章后设法提出,这就是它:
public void uploadImageToServer(String imagePath) throws Exception {
try {
// set the http handlers
httpClient = new DefaultHttpClient();
localContext = new BasicHttpContext(); // why do I need this?
postRequest = new HttpPost("http://asd.com/asd.php");
//postRequest.addHeader("Content-type", "image/jpeg"); // - this didnt work
// deal with the file
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap = BitmapFactory.decodeFile(imagePath);
bitmap.compress(CompressFormat.JPEG, 75, byteArrayOutputStream);
byte[] byteData = byteArrayOutputStream.toByteArray();
//String strData = Base64.encodeToString(data, Base64.DEFAULT); // I have no idea why Im doing this
ByteArrayBody byteArrayBody = new ByteArrayBody(byteData, "image"); // second parameter is the name of the image (//TODO HOW DO I MAKE IT USE THE IMAGE FILENAME?)
// send the package
multipartEntity = MultipartEntityBuilder.create();
multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("uploaded_file", byteArrayBody);
postRequest.setEntity(multipartEntity.build());
// get the response. we will deal with it in onPostExecute.
response = httpClient.execute(postRequest, localContext);
bitmap.recycle();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
错误是:
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
android.os.AsyncTask$3.done(AsyncTask.java:200)
java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
java.util.concurrent.FutureTask.setException(FutureTask.java:125)
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
java.util.concurrent.FutureTask.run(FutureTask.java:138)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.NoClassDefFoundError: org.apache.http.entity.ContentType
org.apache.http.entity.mime.content.ByteArrayBody.<init>(ByteArrayBody.java:67)
org.apache.http.entity.mime.content.ByteArrayBody.<init>(ByteArrayBody.java:87)
答案 0 :(得分:5)
如果您使用的是库,则需要将其放入 / libs 文件夹中。
编辑:
下载httpmime,httpcore和httpclient库答案 1 :(得分:5)
使用此代码上传图像文件
HttpClient client = new DefaultHttpClient();
HttpPost postMethod = new HttpPost("http://localhost/Upload/index.php");
File file = new File(filePath);
MultipartEntity entity = new MultipartEntity();
FileBody contentFile = new FileBody(file);
entity.addPart("userfile",contentFile);
StringBody contentString = new StringBody("This is contentString");
entity.addPart("contentString",contentString);
postMethod.setEntity(entity);
client.execute(postMethod);
并在PHP中使用此代码接收
$uploads_dir = '/Library/WebServer/Documents/Upload/upload/'.$_FILES['userfile']['name'];
if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {
echo $_POST["contentString"]."\n";
echo "File path = ".$uploads_dir;
move_uploaded_file ($_FILES['userfile'] ['tmp_name'], $uploads_dir);
} else {
echo "\n Upload Error";
echo "filename '". $_FILES['userfile']['tmp_name'] . "'.";
print_r($_FILES);
}
答案 2 :(得分:1)
public class HttpMultipartUpload {
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "AaB03x87yxdkjnxvi7";
public String upload(URL url, File file, String fileParameterName,
HashMap<String, String> parameters) throws IOException {
HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream dis = null;
FileInputStream fileInputStream = null;
byte[] buffer;
int maxBufferSize = 20 * 1024;
try {
// ------------------ CLIENT REQUEST
fileInputStream = new FileInputStream(file);
// open a URL connection to the Servlet
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\""
+ fileParameterName + "\"; filename=\"" + mFileName
+ ".jpg" + "\"" + lineEnd);
dos.writeBytes("Content-Type:image/jpg" + lineEnd);
dos.writeBytes(lineEnd);
// create a buffer of maximum size
buffer = new byte[Math.min((int) file.length(), maxBufferSize)];
int length;
// read file and write it into form...
while ((length = fileInputStream.read(buffer)) != -1) {
dos.write(buffer, 0, length);
}
for (String name : parameters.keySet()) {
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\""
+ name + "\"" + lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(parameters.get(name));
}
// send multipart form data necessary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
dos.flush();
} finally {
if (fileInputStream != null)
fileInputStream.close();
if (dos != null)
dos.close();
}
// ------------------ read the SERVER RESPONSE
try {
dis = new DataInputStream(conn.getInputStream());
StringBuilder response = new StringBuilder();
String line;
while ((line = dis.readLine()) != null) {
response.append(line).append('\n');
}
System.out.println("Upload file responce:"
+ response.toString());
return response.toString();
} finally {
if (dis != null)
dis.close();
}
}
}
答案 3 :(得分:0)
如果某人无法弄清楚标题是怎么回事,请看一下这篇文章http://develop-for-android.blogspot.com/2014/01/using-volley-in-your-application.html它只是救了我一天。
答案 4 :(得分:0)
阅读http文件的来源。检查此解决方案:
调用新的MultipartEntity:
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null,Charset.forName(&#34; UTF-8&#34;));
添加请求标题
heads.put(&#34; Content-Type&#34;,&#34; image / png; charset = utf-8&#34;);