2016-12-15 2 views
1

ファイルを添付してサーバー(Java Servlet)に送信できるフォームを含むWebページ(JSP & AngularJS)を作成しました。サーバーはそのファイルを取得し、HTTP POST要求に添付してAPIに転送します。FileItemをHTTP POSTリクエストに添付するにはどうすればいいですか?

JSPファイル内のコードとAngularJSコントローラが正しく動作しているようです。ファイルがWebページからサーバーに送信されると、Javaサーブレット内のファイルの詳細(フィールド名とサイズがコンテンツタイプやファイル名ではない)にアクセスし、System.out.println()を介して出力できます。

私が現時点で直面している問題は、FileItem(添付ファイル)をHttpPost(postRequest)に添付する方法を見つけることです。

ファイルをアップロードする方法についてオンラインでいくつかの例を読んだことがありますが、これらの例では、ファイルはサーバー上のディスクに保存されると仮定しています。これは私の現在のコードは、(問題は、Javaサーブレットセクション内にあるように見えます)

です:

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サーブレット:

次を使用して終了
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

* // ERRORがここにOCCURS * **ケア共有する** –

+0

*ではなく、コンテンツタイプまたはファイル名* **多分これ。? ** –

+0

**添付ファイル**変数がファイルタイプの場合、 'entity.addPart(" attachment "、new FileBody(attachment));'行は実行されますが、代わりにFileItemですEclipseにエラーが表示され、下線が引かれます。 File typeはディスクに保存するのではなく、転送したいので使用できません。 – 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(); 
関連する問題