1

この質問は、前の質問Accessing External Files Into Our Web Applicationの続きです。実際には、struts タグを使用してファイルをアップロードしています。<html:file property="file" />

しかし、その場所からアップロードされた画像を表示したかったのですが、その画像の有効なパスではないsrc場所を取得しています。http://localhost:9443/D:/resources/images/img1.jpg

サーバーディレクトリの外にあるその画像にアクセスする方法。

これは、画像の絶対パスでAjax応答を送信する方法です

public ActionForward getAjaxUploadedFiles(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
    {

        String imagePath = "D:/resources/images/";
        ArrayList<String> path = new ArrayList<String>();

        File imageFile = new File(imagePath);
        File imageFiles[] = imageFile.listFiles();

        for (int i = 0; i < imageFiles.length; i++) {
            path.add(imageFiles[i].getAbsolutePath());
        }

        PrintWriter out = response.getWriter();
        response.setContentType("text/xml");
        response.setHeader("Cache-Control", "no-cache");
        response.setStatus(HttpServletResponse.SC_OK);

        StringBuffer strXMl = new StringBuffer();
        strXMl.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        strXMl.append("<start>"); 


        for (String imagePth : path) {
            strXMl.append("<imagePath>");
            strXMl.append(imagePth);
            strXMl.append("</imagePath>");
        }

        strXMl.append("</start>");

        if(strXMl != null){ 
            String Xml = strXMl.toString();
            out.write(Xml);
            System.err.println("XMl Reponse is: " + Xml);
        }
        else {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        }
        out.flush();

        return mapping.findForward(null);
    }

これは、JSPで画像をレンダリングする方法です

 $(response).find("imagePath").each(function() {
            row = tblReportList.insertRow(0);
            row.className="TableBordergray";
            row.style.width="100%";

            var imagePath = $(this).text();

            cell = row.insertCell(0);
            cell.innerHTML="<img src='" + imagePath + "' alt='" + imagePath + "' height='42' width='42'>";
        });

しかし、imgタグで画像パスを取得していますhttp://localhost:9443/D:/resources/images/img1.jpg

4

2 に答える 2

2

こんにちは、以下は私の質問への回答ImageServletです。画像を表示するために作成した、実行する手順は次のとおりです。

1. web.xml ファイルにマッピングを追加する必要があります。

    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/ImageServlet/*</url-pattern>

2. 作成 ImageServlet:

public class ImageServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {

        //Setting image path
        ImageLocationService locationService = new ImageLocationService();

        try {
            String imageCategory = request.getParameter("imageCategory");
            if (imageCategory != null) {
                this.imagePath = locationService.getImageLocation(imageCategory);
            }else{
                this.imagePath = ConfigConstants.imageLocation;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Get requested image by path info.
        String requestedImage = request.getPathInfo();

        // Check if file name is actually supplied to the request URI.
        if (requestedImage == null) {
            // Do your thing if the image is not supplied to the request URI.
            // Throw an exception, or send 404, or show default/warning image, or just ignore it.
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        // Decode the file name (might contain spaces and on) and prepare file object.
        File image = new File(imagePath, URLDecoder.decode(requestedImage, "UTF-8"));

        // Check if file actually exists in filesystem.
        if (!image.exists()) {
            // Do your thing if the file appears to be non-existing.
            // Throw an exception, or send 404, or show default/warning image, or just ignore it.
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        // Get content type by filename.
        String contentType = getServletContext().getMimeType(image.getName());

        // Check if file is actually an image (avoid download of other files by hackers!).
        // For all content types, see: http://www.w3schools.com/media/media_mimeref.asp
        if (contentType == null || !contentType.startsWith("image")) {
            // Do your thing if the file appears not being a real image.
            // Throw an exception, or send 404, or show default/warning image, or just ignore it.
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        // Init servlet response.
        response.reset();
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setContentType(contentType);
        response.setHeader("Content-Length", String.valueOf(image.length()));
        response.setHeader("Content-Disposition", "inline; filename=\"" + image.getName() + "\"");

        // Prepare streams.
        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {
            // Open streams.
            input = new BufferedInputStream(new FileInputStream(image), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

            // Write file contents to response.
            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
        } finally {
            // Gently close streams.
            close(output);
            close(input);
        }
    }

    private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                // Do your thing with the exception. Print it, log it or mail it.
                e.printStackTrace();
            }
        }
    }
}

3. jsp 側で、ステップ 1 のマッピングをタグに追加する必要があります。 img つまり、input type='image':

<input  type="image" alt='No image found' src='../ImageServlet/append image name that you want to display' />

Actionクラスを作成executeし、メソッドを使用して同じことを行うこともできます。

于 2013-10-14T06:32:35.847 に答える
1

そのような方法で画像をレンダリングすることはできません。Web サーバーは画像パスを相対パスとして扱い、サーバー上の適切な URL の場所を追加します。たとえば、画像を提供するアクションを作成する必要があります。

<action path="/image" ... scope="request" validate="false"/>

次に、HTMLを次のようにレンダリングします

cell.innerHTML="<img src='" + '/image?path=' + imagePath + "' alt='" + imagePath + "' height='42' width='42'>";

ここで、バイナリ イメージ データを応答出力ストリームに書き込むアクションを作成します。pathバイナリ出力用のファイルを見つけることができるアクションでパラメーターを取得します。フラッシング出力が戻っnullた後、ストラットはアクションをさらに進めてはなりません。ヘッダーを追加して a をオフにしCache-Controlて、画像がサーバーから確実に取得されるようにすることもできます。

于 2013-10-04T11:11:48.213 に答える