0

私はこの問題について頭を悩ませている日々であり、おそらくあなたは私よりも多くのことを知っていて、私を助けることができます....そして、私はよりよく説明しようとします.

ライブラリd3.jsを介してhtmlコードページを構築し、それを別のコードの各部分に別の機能で置き換えるjavascriptファイルがあります...ページは課金されません(Ajax)。ある時点で、ユーザーが自分のプロフィール写真に画像をアップロードできるようにする必要があるため、html コードの餌が確実に

<input type="file" id="file">

そして

<input type = "button" onclick = "javaScript: performAjaxSubmit ()">

PerformAjaxSubmit 関数 () は、xmlHttpRequest レベル 2 を介して Java サーブレットにデータを送信します。これは、私が理解していることから、文字列だけでなく、ファイルなどのより複雑なものも送信できます。

機能は次のとおりです。

function performAjaxSubmit() {
    var sampleFile = document.getElementById("file").files[0];
    var formdata = new FormData();
    formdata.append("sampleFile", sampleFile);
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://127.0.0.1:8080/Prova/Upload", true);
    xhr.send(formdata);
    xhr.onload = function(e) {
        if (this.status == 200) {
            alert(this.responseText);
        }
    };
}

代わりに、サーブレットのコードは次のとおりです。

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // Check that we have a file upload request
    System.out.println(request.getAttribute("username"));
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );

      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("C:/Users/Marty/workspaceJEE/Prova/WebContent/imm/utenti"));
      filePath="C:/Users/Marty/workspaceJEE/Prova/WebContent/imm/utenti";
      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try{ 
      // Parse the request to get file items.
      List fileItems = upload.parseRequest(request);

      // Process the uploaded file items
      Iterator i = fileItems.iterator();

      while ( i.hasNext () ) 
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {
            // Get the uploaded file parameters
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            // Write the file
            if( fileName.lastIndexOf("\\") >= 0 ){
               file = new File( filePath +"/"+ 
               fileName.substring( fileName.lastIndexOf("\\"))) ;
            }else{
                System.out.println(filePath + 
               fileName.substring(fileName.lastIndexOf("\\")+1));
               file = new File( filePath +"/"+  
               fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;
         }
      }

   }catch(Exception ex) {
       System.out.println(ex);
   }
}

今(質問が少し長い場合は申し訳ありません)動作しますが、問題は、コマンドで提供したパスに画像が保存されることです:

factory.setRepository(new File("C:/Users/Marty/workspaceJEE/Prova/WebContent/imm/utenti"));

次に、リモートで保存するにはどうすればよいですか? つまり、そのような Altrevista のサイトをロードしたら、それらが C に保存されているのではなく、プロジェクト内のフォルダーに保存されていることを確認するにはどうすればよいですか?

説明したことを願っています。Apache Tomcat v7.0 を使用しています。前もって感謝します!

4

1 に答える 1

0

ServletContext.getRealPathを使用できます

このコードは戻ります<context root>/upload(デプロイメント構成によって異なります)

request.getSession().getServletContext().getRealPath("/upload")
于 2012-10-11T07:56:09.603 に答える