argon3964
@argon3964 (Java Java)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JSのfetchAPIを使って非同期でServletにsubmitしたい

解決したいこと

JSのfetchAPIを使って非同期でServletにsubmitしたい

発生している問題・エラー

リダイレクトしているため、コンソール画面が更新されてエラーをみることができません。
かといって、リダイレクトを防ぐためにformタグをコメント化すると 「IDが見当たらない」
と怒られ、問題のエラーまで到達できません。

該当するソースコード(/WEB-INF/jsp/sell.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
  // プロジェクト名 m_market のサーブレット ItemSell.java にsubmit
  <form action="/m_market/ItemSell" enctype="multipart/form-data" method="post" id="formdata">
       // 送信する値(省略)
  </form>
  <button id="btn">出品する</button>

<script type="text/javascript">

      let button = document.getElementById('btn');

      button.addEventListener('click', function() {

        const fd = new FormData(document.getElementById('formdata'));

        fetch('/sell.jsp', {
            method: 'POST',
            body: fd
        })
            .then(response => {
                return response.blob();
            })
            .then(blob => {
                console.log(blob);
            })
            .catch(error => {
                // エラー処理
                console.log('失敗しました!');
                console.log(error);
            });
      });
</script>
</body>
</html>

自分で試したこと

調べに調べまくりましたがそもそもjsから非同期で
servlet側にsubmitしている記事が見当たりませんでした(;´Д`)ハァハァ

blobがだめなのでしょうか?

非同期のスペシャリストの方、お願いしますm(_ _)m

0

3Answer

すみません、素人の回答です(笑)
いくつか気になったので、何らかの前進になればと回答です。

リダイレクトしているため、コンソール画面が更新されてエラーをみることができません。

コード見る限りだと

preventDefault()

の指定がないせい?

あと、jsで送ってるurlとformのaction先が異なっているところも気になります!
(別に違ってるケースもありますけど)

1Like

ご回答ありがとうございます。

js初心者で急に非同期はきつかったかもしれません。

他の方法として、
jsで動的にmultipart/form-dataをsubmitしてServlet側におくることはできないでしょうか?

調べても全然出てきません(´;ω;`)

0Like

結局、初心に帰って普通のアップロードでやったらできました!

Servletのアップロード関連って結構、難しい内容ばっかり...
出直してきます(;^ω^)
今回は撤退っ, 撤退じゃ~ ゚ε≡≡ヘ( ´Д`)ノ

ごめんなさい!お騒がせしましたm(_ _)m
後続の方のためにサンプルソースを一応置いときます👍

スクリーンショット 2020-12-28 19.27.22.png

package servlet;

import java.io.File;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/ItemSell")
@MultipartConfig
public class ItemSell extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");

			Part part = request.getPart("fileInput");
			boolean isUploaded = uploadFile(part);
			if (!isUploaded) {
				System.out.println("Error: Faild upload.");
			} else {
				System.out.println("Uploaded!");
			}

	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	public boolean uploadFile(Part part) {
		boolean test = false;
		try {
			String fileName = part.getSubmittedFileName();
			// String contentType = part.getContentType();
			// String path = getServletContext().getRealPath("/" + "images" + File.separator + fileName);
			String path = "/Applications/Eclipse_2020-12.app/Contents/workspace/m_market/WebContent/images" + File.separator + fileName;
			part.write(path);
			test = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return test;
	}
}
0Like

Your answer might help someone💌