2016-05-12 92 views
1

我使用以下代码在服务器上传图像,并且它可以正常工作。但我会传递一些参数,我试图通过“价值”作为“测试”,但不起作用。Android |上传带有参数的图像

public int uploadFile(File selectedFile){ 
    int serverResponseCode = 0; 

    HttpURLConnection connection; 
    DataOutputStream dataOutputStream; 
    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 
    String selectedFilePath = selectedFile.getAbsolutePath(); 

    int bytesRead,bytesAvailable,bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 1024 * 1024; 
    if (!selectedFile.isFile()){ 
     //dialog.dismiss(); 
     return 0; 
    }else { 
     try{ 
      FileInputStream fileInputStream = new FileInputStream(selectedFile); 
      URL url = new URL(ServerTools.SERVER+"profile/test.php"); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true);//Allow Inputs 
      connection.setDoOutput(true);//Allow Outputs 
      connection.setUseCaches(false);//Don't use a cached Copy 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Connection", "Keep-Alive"); 
      connection.setRequestProperty("ENCTYPE", "multipart/form-data"); 
      connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
      connection.setRequestProperty("uploaded_file",selectedFilePath); 

      //creating new dataoutputstream 
      dataOutputStream = new DataOutputStream(connection.getOutputStream()); 

      //writing bytes to data outputstream 
      dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); 
      dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" 
        + selectedFilePath + "\"" + lineEnd); 
      dataOutputStream.writeBytes(lineEnd); 

      //returns no. of bytes present in fileInputStream 
      bytesAvailable = fileInputStream.available(); 
      //selecting the buffer size as minimum of available bytes or 1 MB 
      bufferSize = Math.min(bytesAvailable,maxBufferSize); 
      //setting the buffer as byte array of size of bufferSize 
      buffer = new byte[bufferSize]; 

      //reads bytes from FileInputStream(from 0th index of buffer to buffersize) 
      bytesRead = fileInputStream.read(buffer,0,bufferSize); 

      //loop repeats till bytesRead = -1, i.e., no bytes are left to read 
      while (bytesRead > 0){ 
       //write the bytes read from inputstream 
       dataOutputStream.write(buffer,0,bufferSize); 
       bytesAvailable = fileInputStream.available(); 
       bufferSize = Math.min(bytesAvailable,maxBufferSize); 
       bytesRead = fileInputStream.read(buffer,0,bufferSize); 
      } 

      //PARAMS!!! 
      dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); 
      dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"value\"" + lineEnd); 
      dataOutputStream.writeBytes(lineEnd); 
      dataOutputStream.writeBytes("test" + lineEnd); 
      dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); 


      dataOutputStream.writeBytes(lineEnd); 
      dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

      serverResponseCode = connection.getResponseCode(); 
      String serverResponseMessage = connection.getResponseMessage(); 


      BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
      String line; 
      StringBuilder responseOutput = new StringBuilder(); 
      while ((line = br.readLine()) != null) { 
       responseOutput.append(line); 
      } 
      br.close(); 

      Log.i("Test", "Server Response is: " + serverResponseMessage + ": " + serverResponseCode+ " -> "+responseOutput); 

      //closing the input and output streams 
      fileInputStream.close(); 
      dataOutputStream.flush(); 
      dataOutputStream.close(); 

     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    return serverResponseCode; 
} 

我的PHP服务器很简单:

<?php 
$wp = $_FILES['uploaded_file']['tmp_name']; 
move_uploaded_file($wp,"test.jpg"); 
echo "value: ".$_POST["value"]; 
?> 

但Log.d打印:Server Response is: OK: 200 -> value:

我怎么能传递一些参数应用正确地将?

回答

1

您可以使用下面的类简单地将文件部分与文本部分一起放置。

String charset = "UTF-8"; 
String requestURL = BASE_URL + "userregistration"; 

     MultipartUtility multipart = new MultipartUtility(requestURL, charset); 
     multipart.addFormField("username", userJid); 
     multipart.addFilePart("image", imageBitmap);//ima 
     String response = multipart.finish(); 
     Log.d("SERVER REPLIED", response); 

您可以创建一个MultipartUtility类作为后续

public class MultipartUtility { 
    private final String boundary; 
    private static final String LINE_FEED = "\r\n"; 
    private HttpURLConnection httpConn; 
    private String charset; 
    private OutputStream outputStream; 
    private PrintWriter writer; 

    /** 
    * This constructor initializes a new HTTP POST request with content type 
    * is set to multipart/form-data 
    * 
    * @param requestURL 
    * @param charset 
    * @throws IOException 
    */ 
    public MultipartUtility(String requestURL, String charset) 
      throws IOException { 
     this.charset = charset; 
     boundary = "===" + System.currentTimeMillis() + "==="; 

     URL url = new URL(requestURL); 
     httpConn = (HttpURLConnection) url.openConnection(); 
     httpConn.setUseCaches(false); 
     httpConn.setDoOutput(true); // indicates POST method 
     httpConn.setDoInput(true); 
     httpConn.setRequestProperty("Content-Type", 
       "multipart/form-data; boundary=" + boundary); 
     httpConn.setRequestProperty("api_key", "a05f9ece-cd34-11e4-afdc-1681e6b88ec1"); 
     outputStream = httpConn.getOutputStream(); 
     writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), 
       true); 
    } 

    /** 
    * Adds a form field to the request 
    * 
    * @param name field name 
    * @param value field value 
    */ 
    public void addFormField(String name, String value) { 
     writer.append("--"). 
       append(boundary). 
       append(LINE_FEED). 
       append("Content-Disposition: form-data; name=\""). 
       append(name).append("\""). 
       append(LINE_FEED). 
       append("Content-Type: text/plain; charset="). 
       append(charset).append(
       LINE_FEED); 
     writer.append(LINE_FEED); 
     writer.append(value).append(LINE_FEED); 
     writer.flush(); 
    } 

    /** 
    * Adds a upload file section to the request 
    * 
    * @param fieldName name attribute in <input type="file" name="..." /> 
    * @param fileBytes a File to be uploaded 
    * @throws IOException 
    */ 
    public void addFilePart(String fieldName, byte[] fileBytes) 
      throws IOException { 
//  String fileName = uploadFile.getName(); 
     writer.append("--") 
       .append(boundary) 
       .append(LINE_FEED) 
       .append("Content-Disposition: form-data; name=\"") 
       .append(fieldName) 
       .append("\"; filename=\"") 
       .append("user.jpeg") 
       .append("\"") 
       .append(LINE_FEED) 
       .append("Content-Type: image/jpeg") 
       .append(LINE_FEED) 
       .append("Content-Transfer-Encoding: binary") 
       .append(LINE_FEED) 
       .append(LINE_FEED); 
     writer.flush(); 

     ByteArrayInputStream inputStream = new ByteArrayInputStream(fileBytes); 
     byte[] buffer = new byte[4096]; 
     int bytesRead; 
     while ((bytesRead = inputStream.read(buffer)) != -1) { 
      outputStream.write(buffer, 0, bytesRead); 
     } 
     outputStream.flush(); 
     inputStream.close(); 

     writer.append(LINE_FEED); 
     writer.flush(); 
    } 

    /** 
    * Adds a header field to the request. 
    * 
    * @param name - name of the header field 
    * @param value - value of the header field 
    */ 
    public void addHeaderField(String name, String value) { 
     writer.append(name).append(": ").append(value).append(LINE_FEED); 
     writer.flush(); 
    } 

    /** 
    * Completes the request and receives response from the server. 
    * 
    * @return a list of Strings as response in case the server returned 
    * status OK, otherwise an exception is thrown. 
    * @throws IOException 
    */ 

    public String finish() throws IOException { 
     writer.append(LINE_FEED).flush(); 
     writer.append("--") 
       .append(boundary) 
       .append("--") 
       .append(LINE_FEED) 
       .close(); 
     String data = ""; 
     int status = httpConn.getResponseCode(); 
     if (status == HttpURLConnection.HTTP_OK) { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        httpConn.getInputStream())); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       data = data + line; 
      } 
      reader.close(); 
      httpConn.disconnect(); 
     } else { 
      throw new IOException("Server returned non-OK status: " + status); 
     } 
     return data.isEmpty() ? null : data; 
    } 

}

+0

谢谢!解决方案易于实现,它的工作完美。 –

0

部分我工作的代码文件头,只检查/ try如果it's为你工作

outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
outputStream.writeBytes("Content-Disposition: form-data; name=\"" + jsonField + "\"; filename=\"" + q[jsonName] + "\"" + lineEnd); 
outputStream.writeBytes("Content-Type: " + "application/json" + lineEnd); 
outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd); 

outputStream.writeBytes(lineEnd); 
+0

谢谢,但我解决了另一个答复! –