詳解React、ajax、java實作上傳圖片並預覽功能
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 === '' ? 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('post', 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技巧
#以上是詳解React、ajax、java實作上傳圖片並預覽功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

React通過JSX與HTML結合,提升用戶體驗。 1)JSX嵌入HTML,使開發更直觀。 2)虛擬DOM機制優化性能,減少DOM操作。 3)組件化管理UI,提高可維護性。 4)狀態管理和事件處理增強交互性。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

React是構建交互式前端體驗的首選工具。 1)React通過組件化和虛擬DOM簡化UI開發。 2)組件分為函數組件和類組件,函數組件更簡潔,類組件提供更多生命週期方法。 3)React的工作原理依賴虛擬DOM和調和算法,提高性能。 4)狀態管理使用useState或this.state,生命週期方法如componentDidMount用於特定邏輯。 5)基本用法包括創建組件和管理狀態,高級用法涉及自定義鉤子和性能優化。 6)常見錯誤包括狀態更新不當和性能問題,調試技巧包括使用ReactDevTools和優

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
