백엔드 개발 PHP 튜토리얼 이미지 업로드 및 미리보기 기능 구현을 위한 React, ajax, java에 대한 자세한 설명

이미지 업로드 및 미리보기 기능 구현을 위한 React, ajax, java에 대한 자세한 설명

Dec 26, 2017 am 10:40 AM
ajax java react

React+ajax+java를 사용하여 이미지를 업로드하고 미리 보는 방법은 무엇입니까? 이 글은 React, ajax, java를 사용하여 이미지를 업로드하고 미리보기하는 기능을 공유할 것입니다. 관심 있는 친구들이 참고하면 도움이 될 것입니다.

인터넷에 사진을 올리는 ajax에 대한 정보를 찾아보던 중 대부분이 jQuery를 사용해서 작성했는데, 여기서는 JQuery를 사용하는 것이 별로 쓸모가 없어서 위의 사진이 먼저 작성되었습니다.

위 사진에서 먼저 위의 선택 파일을 클릭하세요. 사진을 선택한 후 사진이 자동으로 서버에 업로드되며, 서버에 있는 사진의 이름과 경로가 반환됩니다. 그러면 파일 이름과 사진이 페이지에 표시됩니다.

소스 코드: ajax 업로드 미리보기

React:


import React from 'react';
import Http from './http'

const URL = 'http://localhost:8080/fileuploadExample/UploadServlet';

export default class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      uploadedFile: "",
      uploadedFileGetUrl: ''
    };
  }

  error() {
    alert('error')
  }

  callback(result) {
    this.setState({
      uploadedFile: result.uploadedFile,
      uploadedFileGetUrl: result.uploadedFileGetUrl
    });
  }

  handleImageUpload(e) {
    e.preventDefault()
    let file = e.target
    Http.post(URL, file, this.callback.bind(this), this.error)
  }

  render() {
    return (
      <p>
        <input type="file" onChange={this.handleImageUpload.bind(this)}/>
        <p>
          {this.state.uploadedFileGetUrl === &#39;&#39; ? null :
            <p>
              <p>{this.state.uploadedFile}</p>
              <img src={this.state.uploadedFileGetUrl} alt="你选择的图片"/>
            </p>}
        </p>
      </p>
    )
  }
}
로그인 후 복사

자체 캡슐화된 Ajax 코드:


var Http = (function() {
  var http = {};
  if (typeof window.XMLHttpRequest === "undefined") {
    window.XMLHttpRequest = function() {
      // 如果是i5就用Microsoft,其他就用Msxml2
      return new window.ActiveXObject(navigator.userAgent
          .indexOf("MSIE 5") >= 0 ? "Microsoft.XMLHTTP"
          : "Msxml2.XMLHTTP");
    };
  }
  http.post = function(url, data, callback, error) {
    if (typeof data === "function") {//data可以不穿值
      callback = data;
      data = null;
    }
    var timeout = setTimeout(function() {//超时设置
      error();
    }, 10000);
    var xhr = new XMLHttpRequest();
    xhr.open(&#39;post&#39;, url);
    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        clearTimeout(timeout);//清除超时
        if (xhr.status === 200){
          //alert(xhr.responseText);
          callback(JSON.parse(xhr.responseText));//调用回调函数
        } else {
          error();
        }
        xhr = null;// 删除对象,防止内存溢出
      }
    };
    xhr.onerror = function() {//如果产生了错误
      clearTimeout(timeout);
      error();
    };
    xhr.send(http.formDataCode(data));
  };
  http.formDataCode = function(data) {
    var fd = new FormData();
    if (!data) {
      return null;
    }
    for ( var key in data) {
      if(data.files){
        var file=data.files[0];
        fd.append("image", file);
      }else{
        fd.append(key, data[key]);
      }
    }
    return fd;
  }
  return http;
})();

export default Http
로그인 후 복사

Java 백그라운드에서 이미지를 업로드하는 경우 인터넷에 많은 예가 있습니다. 사용할 수 있는 내용은 http://blog.csdn.net/thc1987/article/details/15341201에서 배웠습니다. 관심이 있으시면 살펴보세요:


package com.example;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

  // 保存文件的目录
  private static String PATH_FOLDER = "/";
  // 存放临时文件的目录
  private static String TEMP_FOLDER = "/";

  /**
   * @see HttpServlet#HttpServlet()
   */
  public UploadServlet() {
    super();
    // TODO Auto-generated constructor stub
  }

  @Override
  public void init(ServletConfig config) throws ServletException {
    // TODO Auto-generated method stub
    super.init();

    ServletContext servletCtx = config.getServletContext();
    // 初始化路径
    // 保存文件的目录
    PATH_FOLDER = servletCtx.getRealPath("/upload");
    // 存放临时文件的目录,存放xxx.tmp文件的目录
    TEMP_FOLDER = servletCtx.getRealPath("/uploadTemp");
  }

  /**
   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
   *   response)
   */
  protected void doGet(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
    response.setHeader("Access-Control-Allow-Origin",
        "http://localhost:3000");
    response.setHeader("Access-Control-Allow-Credentials", "true");

    request.setCharacterEncoding("utf-8"); // 设置编码
    response.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=UTF-8");
    // 获得磁盘文件条目工厂
    DiskFileItemFactory factory = new DiskFileItemFactory();

    // 如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
    // 设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
    /**
     * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem
     * 格式的 然后再将其真正写到 对应目录的硬盘上
     */
    factory.setRepository(new File(TEMP_FOLDER));
    // 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
    factory.setSizeThreshold(1024 * 1024);

    // 高水平的API文件上传处理
    ServletFileUpload upload = new ServletFileUpload(factory);

    try {
      // 提交上来的信息都在这个list里面
      // 这意味着可以上传多个文件
      // 请自行组织代码
      List<FileItem> list = upload.parseRequest(request);
      // 获取上传的文件
      FileItem item = getUploadFileItem(list);
      // 获取文件名
      String filename = getUploadFileName(item);
      // 保存后的文件名
      String saveName = new Date().getTime()
          + filename.substring(filename.lastIndexOf("."));
      // 保存后图片的浏览器访问路径
      String picUrl = request.getScheme() + "://"
          + request.getServerName() + ":" + request.getServerPort()
          + request.getContextPath() + "/upload/" + saveName;

      System.out.println("存放目录:" + PATH_FOLDER);
      System.out.println("文件名:" + filename);
      System.out.println("浏览器访问路径:" + picUrl);

      // 真正写到磁盘上
      item.write(new File(PATH_FOLDER, saveName)); // 第三方提供的

      PrintWriter writer = response.getWriter();

      System.out.print("{");
      System.out.print("uploadedFile:"+ "\"" + filename + "\"");
      System.out.print(",uploadedFileGetUrl:\"" + picUrl + "\"");
      System.out.print("}");
      
      JSONObject result = new JSONObject();
      result.put("uploadedFile", filename);

      result.put("uploadedFileGetUrl", picUrl);
      writer.write(result.toString());
      writer.close();
    } catch (Exception e) {
      e.printStackTrace();
      /*
       * PrintWriter writer = response.getWriter(); writer.print("{");
       * writer.print("error:"+e.toString()); writer.print("}");
       * writer.close();
       */
    }
  }

  private FileItem getUploadFileItem(List<FileItem> list) {
    for (FileItem fileItem : list) {
      if (!fileItem.isFormField()) {
        return fileItem;
      }
    }
    return null;
  }

  private String getUploadFileName(FileItem item) {
    // 获取路径名
    String value = item.getName();
    System.out.println(value + ":value");
    // 索引到最后一个反斜杠
    int start = value.lastIndexOf("/");
    // 截取 上传文件的 字符串名字,加1是 去掉反斜杠,
    String filename = value.substring(start + 1);
    return filename;
  }

  /**
   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
   *   response)
   */
  protected void doPost(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
  }

}
로그인 후 복사

위의 Java 코드

1. 삽입


response.setHeader("Access-Control-Allow-Origin","http://localhost:3000");
response.setHeader("Access-Control-Allow-Credentials", "true");
로그인 후 복사

이 두 줄의 코드는 물론 안전하지 않을 수 있습니다.

2,


JSONObject result = new JSONObject();
result.put("uploadedFile", filename);

result.put("uploadedFileGetUrl", picUrl);
writer.write(result.toString());
로그인 후 복사

여기에 json 데이터가 있습니다. 페이지와 서버 사이에 전송됩니다

관련 권장사항:

이미지 업로드 및 미리보기를 위한 JavaScript 구현 코드_Javascript 기술

이미지 업로드 및 먼저 미리보기를 위한 Ajax 구현 방법

이미지 미리보기를 위한 nodejs 예제 코드 그리고 업로드

위 내용은 이미지 업로드 및 미리보기 기능 구현을 위한 React, ajax, java에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

vue.js vs. React : 프로젝트 별 고려 사항 vue.js vs. React : 프로젝트 별 고려 사항 Apr 09, 2025 am 12:01 AM

vue.js는 중소형 프로젝트 및 빠른 반복에 적합한 반면 React는 크고 복잡한 응용 프로그램에 적합합니다. 1) vue.js는 사용하기 쉽고 팀이 불충분하거나 프로젝트 규모가 작는 상황에 적합합니다. 2) React는 더 풍부한 생태계를 가지고 있으며 고성능 및 복잡한 기능적 요구가있는 프로젝트에 적합합니다.

캡슐의 양을 찾기위한 Java 프로그램 캡슐의 양을 찾기위한 Java 프로그램 Feb 07, 2025 am 11:37 AM

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

Spring Tool Suite에서 첫 번째 Spring Boot 응용 프로그램을 실행하는 방법은 무엇입니까? Spring Tool Suite에서 첫 번째 Spring Boot 응용 프로그램을 실행하는 방법은 무엇입니까? Feb 07, 2025 pm 12:11 PM

Spring Boot는 강력하고 확장 가능하며 생산 가능한 Java 응용 프로그램의 생성을 단순화하여 Java 개발에 혁명을 일으킨다. Spring Ecosystem에 내재 된 "구성에 대한 협약"접근 방식은 수동 설정, Allo를 최소화합니다.

미래를 창조하세요: 완전 초보자를 위한 Java 프로그래밍 미래를 창조하세요: 완전 초보자를 위한 Java 프로그래밍 Oct 13, 2024 pm 01:32 PM

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.

Java Made Simple: 초보자를 위한 프로그래밍 능력 가이드 Java Made Simple: 초보자를 위한 프로그래밍 능력 가이드 Oct 11, 2024 pm 06:30 PM

간단해진 Java: 강력한 프로그래밍을 위한 초보자 가이드 소개 Java는 모바일 애플리케이션에서 엔터프라이즈 수준 시스템에 이르기까지 모든 분야에서 사용되는 강력한 프로그래밍 언어입니다. 초보자의 경우 Java의 구문은 간단하고 이해하기 쉬우므로 프로그래밍 학습에 이상적인 선택입니다. 기본 구문 Java는 클래스 기반 객체 지향 프로그래밍 패러다임을 사용합니다. 클래스는 관련 데이터와 동작을 함께 구성하는 템플릿입니다. 다음은 간단한 Java 클래스 예입니다. publicclassPerson{privateStringname;privateintage;

HTML에서 React의 역할 : 사용자 경험 향상 HTML에서 React의 역할 : 사용자 경험 향상 Apr 09, 2025 am 12:11 AM

React는 JSX와 HTML을 결합하여 사용자 경험을 향상시킵니다. 1) JSX는 개발을보다 직관적으로 만들기 위해 HTML을 포함시킨다. 2) 가상 DOM 메커니즘은 성능을 최적화하고 DOM 운영을 줄입니다. 3) 유지 보수성을 향상시키기위한 구성 요소 기반 관리 UI. 4) 상태 관리 및 이벤트 처리는 상호 작용을 향상시킵니다.

스택 하단에 요소를 삽입하는 Java 프로그램 스택 하단에 요소를 삽입하는 Java 프로그램 Feb 07, 2025 am 11:59 AM

스택은 Lifo (마지막으로, 첫 번째) 원칙을 따르는 데이터 구조입니다. 다시 말해서, 우리가 스택에 추가하는 마지막 요소는 제거 된 첫 번째 요소입니다. 우리가 스택에 요소를 추가 (또는 푸시) 할 때, 그것들은 상단에 배치됩니다. 즉, 무엇보다도

See all articles