猿问

使用POST和HttpURLConnection发送文件

使用POST和HttpURLConnection发送文件

因为Android开发者推荐使用HttpURLConnection类时,我想知道是否有人可以提供一个很好的示例,说明如何通过POST将位图“文件”(实际上是内存中的流)发送到ApacheHTTP服务器。我对cookie或身份验证或任何复杂的东西不感兴趣,但我只想有一个可靠的逻辑实现。我在这里看到的所有例子看上去都更像是“让我们试试这个,也许它是有用的”。

现在,我有这样的代码:

URL url;HttpURLConnection urlConnection = null;try {
    url = new URL("http://example.com/server.cgi");

    urlConnection = (HttpURLConnection) url.openConnection();} catch (Exception e) {
    this.showDialog(getApplicationContext(), e.getMessage());}finally {
    if (urlConnection != null)
    {
        urlConnection.disconnect();
    }}

其中,showDialog应该只显示AlertDialog(如果URL无效?)。

现在,假设我生成了如下所示的位图:Bitmap image = this.getBitmap()中派生的控件内部。View我想通过邮寄出去。实现这一目标的适当程序是什么?我需要使用哪些类?我能用一下吗HttpPost就像在这个例子?如果是这样,我将如何构造InputStreamEntity我的位图?我会发现,要求首先将位图存储在设备上的文件中是令人反感的。


我还应该提到,我确实需要将原始位图的每个未更改的像素发送到服务器,因此我无法将其转换为JPEG。


慕村225694
浏览 1214回答 3
3回答

呼如林

使用MultipartUtility用简单的方式。MultipartUtility.javapublic&nbsp;class&nbsp;MultipartUtility&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;String&nbsp;boundary; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;String&nbsp;LINE_FEED&nbsp;=&nbsp;"\r\n"; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;HttpURLConnection&nbsp;httpConn; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;charset; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;OutputStream&nbsp;outputStream; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;PrintWriter&nbsp;writer; &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;constructor&nbsp;initializes&nbsp;a&nbsp;new&nbsp;HTTP&nbsp;POST&nbsp;request&nbsp;with&nbsp;content&nbsp;type &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;is&nbsp;set&nbsp;to&nbsp;multipart/form-data &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;requestURL &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;charset &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;MultipartUtility(String&nbsp;requestURL,&nbsp;String&nbsp;charset) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IOException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.charset&nbsp;=&nbsp;charset; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;creates&nbsp;a&nbsp;unique&nbsp;boundary&nbsp;based&nbsp;on&nbsp;time&nbsp;stamp &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boundary&nbsp;=&nbsp;"==="&nbsp;+&nbsp;System.currentTimeMillis()&nbsp;+&nbsp;"==="; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;=&nbsp;new&nbsp;URL(requestURL); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e("URL",&nbsp;"URL&nbsp;:&nbsp;"&nbsp;+&nbsp;requestURL.toString()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn&nbsp;=&nbsp;(HttpURLConnection)&nbsp;url.openConnection(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setUseCaches(false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setDoOutput(true);&nbsp;//&nbsp;indicates&nbsp;POST&nbsp;method &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setDoInput(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setRequestProperty("Content-Type", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"multipart/form-data;&nbsp;boundary="&nbsp;+&nbsp;boundary); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setRequestProperty("User-Agent",&nbsp;"CodeJava&nbsp;Agent"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setRequestProperty("Test",&nbsp;"Bonjour"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream&nbsp;=&nbsp;httpConn.getOutputStream(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer&nbsp;=&nbsp;new&nbsp;PrintWriter(new&nbsp;OutputStreamWriter(outputStream,&nbsp;charset), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Adds&nbsp;a&nbsp;form&nbsp;field&nbsp;to&nbsp;the&nbsp;request &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;name&nbsp;&nbsp;field&nbsp;name &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value&nbsp;field&nbsp;value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;addFormField(String&nbsp;name,&nbsp;String&nbsp;value)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append("--"&nbsp;+&nbsp;boundary).append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append("Content-Disposition:&nbsp;form-data;&nbsp;name=\""&nbsp;+&nbsp;name&nbsp;+&nbsp;"\"") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append("Content-Type:&nbsp;text/plain;&nbsp;charset="&nbsp;+&nbsp;charset).append( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append(value).append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.flush(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Adds&nbsp;a&nbsp;upload&nbsp;file&nbsp;section&nbsp;to&nbsp;the&nbsp;request &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;fieldName&nbsp;&nbsp;name&nbsp;attribute&nbsp;in&nbsp;<input&nbsp;type="file"&nbsp;name="..."&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;uploadFile&nbsp;a&nbsp;File&nbsp;to&nbsp;be&nbsp;uploaded &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;addFilePart(String&nbsp;fieldName,&nbsp;File&nbsp;uploadFile) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IOException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName&nbsp;=&nbsp;uploadFile.getName(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append("--"&nbsp;+&nbsp;boundary).append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Content-Disposition:&nbsp;form-data;&nbsp;name=\""&nbsp;+&nbsp;fieldName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"\";&nbsp;filename=\""&nbsp;+&nbsp;fileName&nbsp;+&nbsp;"\"") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Content-Type:&nbsp;" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;URLConnection.guessContentTypeFromName(fileName)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append("Content-Transfer-Encoding:&nbsp;binary").append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.flush(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;inputStream&nbsp;=&nbsp;new&nbsp;FileInputStream(uploadFile); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;buffer&nbsp;=&nbsp;new&nbsp;byte[4096]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;bytesRead&nbsp;=&nbsp;-1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((bytesRead&nbsp;=&nbsp;inputStream.read(buffer))&nbsp;!=&nbsp;-1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream.write(buffer,&nbsp;0,&nbsp;bytesRead); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream.flush(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputStream.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.flush(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Adds&nbsp;a&nbsp;header&nbsp;field&nbsp;to&nbsp;the&nbsp;request. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;name&nbsp;&nbsp;-&nbsp;name&nbsp;of&nbsp;the&nbsp;header&nbsp;field &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value&nbsp;-&nbsp;value&nbsp;of&nbsp;the&nbsp;header&nbsp;field &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;addHeaderField(String&nbsp;name,&nbsp;String&nbsp;value)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append(name&nbsp;+&nbsp;":&nbsp;"&nbsp;+&nbsp;value).append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.flush(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Completes&nbsp;the&nbsp;request&nbsp;and&nbsp;receives&nbsp;response&nbsp;from&nbsp;the&nbsp;server. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;a&nbsp;list&nbsp;of&nbsp;Strings&nbsp;as&nbsp;response&nbsp;in&nbsp;case&nbsp;the&nbsp;server&nbsp;returned &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;status&nbsp;OK,&nbsp;otherwise&nbsp;an&nbsp;exception&nbsp;is&nbsp;thrown. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;finish()&nbsp;throws&nbsp;IOException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;response&nbsp;=&nbsp;new&nbsp;StringBuffer(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append(LINE_FEED).flush(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.append("--"&nbsp;+&nbsp;boundary&nbsp;+&nbsp;"--").append(LINE_FEED); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;checks&nbsp;server's&nbsp;status&nbsp;code&nbsp;first &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;status&nbsp;=&nbsp;httpConn.getResponseCode(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(status&nbsp;==&nbsp;HttpURLConnection.HTTP_OK)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;reader&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;InputStreamReader( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.getInputStream())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((line&nbsp;=&nbsp;reader.readLine())&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.append(line); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.disconnect(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IOException("Server&nbsp;returned&nbsp;non-OK&nbsp;status:&nbsp;"&nbsp;+&nbsp;status); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;response.toString(); &nbsp;&nbsp;&nbsp;&nbsp;}}到upload你,你们file还有参数。注意:将下面的代码放在非UI线程中以获得响应。String&nbsp;charset&nbsp;=&nbsp;"UTF-8";String&nbsp;requestURL&nbsp;=&nbsp;"YOUR_URL";MultipartUtility&nbsp;multipart&nbsp;=&nbsp;new&nbsp;MultipartUtility(requestURL,&nbsp;charset); multipart.addFormField("param_name_1",&nbsp;"param_value");multipart.addFormField("param_name_2",&nbsp;"param_value"); multipart.addFormField("param_name_3",&nbsp;"param_value");multipart.addFilePart("file_param_1",&nbsp;new&nbsp;File(file_path)); String&nbsp;response&nbsp;=&nbsp;multipart.finish();&nbsp;//&nbsp;response&nbsp;from&nbsp;server.
随时随地看视频慕课网APP
我要回答