2013-07-23 61 views
0

我想从Apache Tomcat Web服务器中的Android设备接收上传文件。 Android的代码似乎是正确的,但我有问题处理服务器端的数据。将文件从Android上传到Tomcat

这是客户:

public String uploadStorageFile(String appId, String pathToFile) { 
    HttpURLConnection connection = null; 
    DataOutputStream outputStream = null; 
    DataInputStream inputStream = null; 
    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 

    String storageUrl = url + "/" + appId + "/storage"; 
    int bytesRead, bytesAvailable, bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 1*1024*1024; 
    String serverResponseMessage = null; 
    try 
    { 
    FileInputStream fileInputStream = new FileInputStream(new File(pathToFile)); 

    URL url = new URL(storageUrl); 
    connection = (HttpURLConnection) url.openConnection(); 

    // Allow Inputs & Outputs 
    connection.setDoInput(true); 
    connection.setDoOutput(true); 
    connection.setUseCaches(false); 

    // Enable POST method 
    connection.setRequestMethod("POST"); 

    connection.setRequestProperty("Connection", "Keep-Alive"); 
    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 

    outputStream = new DataOutputStream(connection.getOutputStream()); 
    outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
    outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToFile +"\"" + lineEnd); 
    outputStream.writeBytes(lineEnd); 

    bytesAvailable = fileInputStream.available(); 
    bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    buffer = new byte[bufferSize]; 

    // Read file 
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

    while (bytesRead > 0) 
    { 
    outputStream.write(buffer, 0, bufferSize); 
    bytesAvailable = fileInputStream.available(); 
    bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    } 

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

    // Responses from the server (code and message) 
    int serverResponseCode = connection.getResponseCode(); 
    serverResponseMessage = connection.getResponseMessage(); 

    fileInputStream.close(); 
    outputStream.flush(); 
    outputStream.close(); 
    } 
    catch (Exception ex) 
    { 
    //Exception handling 
    } 
    return serverResponseMessage; 
} 

这是服务器端:

@POST 
@Consumes({ MediaType.MULTIPART_FORM_DATA }) 
@Produces({ MediaType.APPLICATION_JSON }) 
public Response uploadStorageFile(@Context UriInfo ui, @Context HttpHeaders hh, @FormDataParam("file") InputStream uploadedInputStream, 
     @FormDataParam("filename") FormDataContentDisposition fileDetail){ 
    String uploadedFileLocation = fileDetail.getFileName(); 

    // save it 
    writeToFile(uploadedInputStream, uploadedFileLocation); 

    String output = "File uploaded to : " + uploadedFileLocation; 

    return Response.status(200).entity(output).build(); 

} 
private void writeToFile(InputStream uploadedInputStream, 
     String uploadedFileLocation) { 

     try { 
      OutputStream out = new FileOutputStream(new File(
        uploadedFileLocation)); 
      int read = 0; 
      byte[] bytes = new byte[1024]; 

      out = new FileOutputStream(new File(uploadedFileLocation)); 
      while ((read = uploadedInputStream.read(bytes)) != -1) { 
       out.write(bytes, 0, read); 
      } 
      out.flush(); 
      out.close(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

    } 

我现在面临的问题是,fileDetail为空,所以是uploadedInputStream,我在做什么错?

谢谢

回答

1

uploadStorageFile方法这两个文件有关的客体实际上是绑定到同一 FormDataParam(即 - file)。

试着改变你的 FormDataContentDisposition相同的PARAM名称作为 InputStream

编辑:对不起,我完全错过了别的东西。您发送的表单参数的名称实际上是“uploadedFile”,而不是filefilename。同时改变你的FormDataParam的的绑定到帕拉姆命名为uploadedFile,他们不应该再为空。

+0

谢谢,我完全错过了。 – HeWhoCodes