2016-12-15 75 views
1

我已经创建了一个包含窗体允许用户附加文件,并将其发送到服务器(Java Servlet的)网页(JSP & AngularJS)。然后服务器将接收该文件并通过将其附加到HTTP POST请求将其转发到API。如何将FileItem附加到HTTP POST请求?

我在JSP文件中的时刻代码和AngularJS控制器似乎正常工作。一旦文件从网页发送到服务器,我就可以访问Java Servlet中的一些文件详细信息(字段名称和大小,但不是内容类型或文件名),并通过System.out.println()将其打印出来。

我面对目前的问题是试图找到一种方法如何安装的FileItem(附件)到HttpPost(postRequest)。

我已经在文件如何上传读了一些在线的例子,但这些例子总是假设该文件将被存储在服务器而不是其他地方转发的磁盘上。

这是我当前的代码(这个问题似乎是在Java Servlet的部分):

JSP文件:

<form name="issueForm"> 
    <input id="attachment" class="form-control" type="file" data-ng-model="attachment"/> 
    <button type="submit" data-ng-click="setAttachment()">Create Issue</button> 
</form> 

AngularJS控制器:

app.directive('fileModel', ['$parse', function ($parse) { 
    return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      var model = $parse(attrs.fileModel); 
      var modelSetter = model.assign; 

      element.bind('change', function() { 
       scope.$apply(function() { 
        modelSetter(scope, element[0].files[0]); 
       }); 
      }); 
     } 
    }; 
}]); 

$scope.setAttachment = function() 
{ 
    var attachment = $scope.attachment; 
    var fd = new FormData(); 
    fd.append('attachment', attachment); 

    $http({ 
     url: 'IssueAttachment', 
     method: 'POST', 
     transformRequest: function(data, headersGetterFunction) { return data; }, 
     headers: { 'Content-Type': undefined }, 
     data: fd 
    }) 
    .success(function(data, status) { alert("Success: " + status); }) 
    .error(function(data, status) { alert("Error: " + status); }); 
} 

Java Servlet:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
FileItem attachment = null; 
boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

if (!isMultipart) { System.out.println("Not Multipart Content!"); } 
else { 
    FileItemFactory factory = new DiskFileItemFactory(); 
    ServletFileUpload upload = new ServletFileUpload(factory); 
    List items = null; 
    try { 
     items = upload.parseRequest(new ServletRequestContext(request)); 
    } catch (FileUploadException e) { e.printStackTrace(); } 
    try { 
     //Get attachment and print details 
     //This section prints "attachment", 9, null, null in that order). 
     attachment = (FileItem) items.get(0); 
     System.out.println("Field Name: " + attachment.getFieldName()); 
     System.out.println("Size: " + attachment.getSize()); 
     System.out.println("Content Type: " + attachment.getContentType()); 
     System.out.println("File Name: " + attachment.getName()); 
    } catch (Exception e) { e.printStackTrace(); } 

    //Create a HTTP POST and send the attachment. 
    HttpClient httpClient = HttpClientBuilder.create().build(); 
    HttpPost postRequest = new HttpPost(API_URL); 
    MultipartEntityBuilder entity = MultipartEntityBuilder.create(); 
    entity.addPart("attachment", new FileBody(attachment)); //THE ERROR OCCURS HERE. 
    postRequest.setEntity(entity.build()); 
    try { 
     HttpResponse response = httpClient.execute(postRequest); 
    } catch (IOException e) { e.printStackTrace(); } 
} 
} 
+0

* //错误发生时HERE * **保健佳品** –

+0

*而不是内容类型或文件名* **也许这?告诉你什么?** –

+0

如果** attachment **变量是一个文件类型,那么行'entity.addPart(“attachment”,new FileBody(attachment));'会运行,但它是一个FileItem Eclipse会出现一个错误并强调它。我不能使用文件类型,因为我不想将它存储在磁盘上,而是转发它。 – dat3450

回答

1

最终使用下列内容:

FileItem file = (FileItem)items.get(0); 
//Create a temporary file. 
File myFile = File.createTempFile(base, extension); 
//Write contents to temporary file. 
file.write(myFile); 

/** 
* Do whatever you want with the temporary file here... 
*/ 

//Delete the temporary file. 
myFile.delete(); //-OR- myFile.deleteOnExit();