由于Android开发人员删除了Apache HTTP Client,因此我将转向HttpURLConnection。我能够重写我所有的函数,只有一个除外。我正在发送带有名称和日期的字节数组(图像)。实际上,我的函数允许一次发送多张图像,但我只发送了一张。到目前为止,我一直使用MultipartEntityBuilder构建HttpEntity,并通过httpPost.setEntity(entity)设置它。然而,我想摆脱MultipartEntityBuilder。
现在我有以下代码片段:
public void sendImage(URL url, byte[] image, String name, long date) {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entityBuilder.addBinaryBody("file[]", image);
entityBuilder.addTextBody("file_name[]", name);
entityBuilder.addTextBody("file_size[]", String.valueOf(date));
HttpEntity entity = entityBuilder.build();
conn.addRequestProperty(entity.getContentType().getName(), entity.getContentType().getValue());
OutputStream os = conn.getOutputStream();
entity.writeTo(os);
os.close();
conn.connect();
// read response code
}在服务器端,我可以像这样接收数据:
$file = $_POST['file'];
$file_name = $_POST['file_name'];
$file_size = $_POST['file_size'];我不能改变服务器实现。
我尝试了这个线程的解决方案:Sending files using POST with HttpURLConnection,但我不知道如何将其调整到我的服务器上。
有没有办法摆脱HttpEntity?我现在不想使用其他库(Volley,OkHttp或Retrofit)。我可能会在将来转到其中的一个。
谢谢你的帮助。
发布于 2016-02-25 19:24:37
要将文件发送到服务器,您需要使用您可以编写的MultipartEntity类,如below.And所示,您可以将数据传递给它,如下所示。
AndroidMultiPartEntity entity = new AndroidMultiPartEntity();
File sourceFile = new File("yourpathhere");
entity.addPart("userfile", new FileBody(sourceFile));您可以按如下方式编写服务器代码
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(targetURL);
httppost.setEntity(entity);
// Making server call
HttpResponse responseObj = httpclient.execute(httppost);
HttpEntity r_entity = responseObj.getEntity();
int statusCode = responseObj.getStatusLine().getStatusCode();
if (statusCode == 200) {
// Server response
response = EntityUtils.toString(r_entity);
} else {
response = "Error occurred! Http Status Code: "+ statusCode;
}MultipartEntityClass:
public class AndroidMultiPartEntity extends MultipartEntity
{
//private final ProgressListener listener;
public AndroidMultiPartEntity() {
super();
//this.listener = listener;
}
public AndroidMultiPartEntity(final HttpMultipartMode mode,
final ProgressListener listener) {
super(mode);
//this.listener = listener;
}
public AndroidMultiPartEntity(HttpMultipartMode mode, final String boundary,
final Charset charset, final ProgressListener listener) {
super(mode, boundary, charset);
//this.listener = listener;
}
@Override
public void writeTo(final OutputStream outstream) throws IOException {
super.writeTo(new CountingOutputStream(outstream));
}
public static interface ProgressListener {
void transferred(long num);
}
public static class CountingOutputStream extends FilterOutputStream {
// private final ProgressListener listener;
private long transferred;
public CountingOutputStream(final OutputStream out) {
super(out);
// this.listener = listener;
this.transferred = 0;
}
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
this.transferred += len;
//this.listener.transferred(this.transferred);
}
public void write(int b) throws IOException {
out.write(b);
this.transferred++;
//this.listener.transferred(this.transferred);
}
}
}https://stackoverflow.com/questions/35625444
复制相似问题