react如何提交图片
使用表单提交图片
在React中提交图片可以通过HTML的<input type="file">元素结合表单提交实现。创建一个表单,设置enctype为multipart/form-data以支持文件上传。
import { useState } from 'react';
function ImageUpload() {
const [selectedFile, setSelectedFile] = useState(null);
const handleFileChange = (event) => {
setSelectedFile(event.target.files[0]);
};
const handleSubmit = async (event) => {
event.preventDefault();
const formData = new FormData();
formData.append('image', selectedFile);
try {
const response = await fetch('https://your-api-endpoint.com/upload', {
method: 'POST',
body: formData,
});
const result = await response.json();
console.log('Success:', result);
} catch (error) {
console.error('Error:', error);
}
};
return (
<form onSubmit={handleSubmit}>
<input type="file" onChange={handleFileChange} />
<button type="submit">Upload</button>
</form>
);
}
使用第三方库简化上传
对于更复杂的场景,可以使用如axios的库简化HTTP请求。安装axios后,可以更灵活地处理文件上传。

import axios from 'axios';
import { useState } from 'react';
function ImageUpload() {
const [selectedFile, setSelectedFile] = useState(null);
const handleFileChange = (event) => {
setSelectedFile(event.target.files[0]);
};
const handleSubmit = async (event) => {
event.preventDefault();
const formData = new FormData();
formData.append('image', selectedFile);
try {
const response = await axios.post('https://your-api-endpoint.com/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
});
console.log('Success:', response.data);
} catch (error) {
console.error('Error:', error);
}
};
return (
<form onSubmit={handleSubmit}>
<input type="file" onChange={handleFileChange} />
<button type="submit">Upload</button>
</form>
);
}
预览上传的图片
在提交前预览图片可以提升用户体验。通过URL.createObjectURL生成临时URL并显示在页面上。

import { useState } from 'react';
function ImageUploadWithPreview() {
const [selectedFile, setSelectedFile] = useState(null);
const [previewUrl, setPreviewUrl] = useState('');
const handleFileChange = (event) => {
const file = event.target.files[0];
setSelectedFile(file);
setPreviewUrl(URL.createObjectURL(file));
};
const handleSubmit = async (event) => {
event.preventDefault();
if (!selectedFile) return;
const formData = new FormData();
formData.append('image', selectedFile);
try {
const response = await fetch('https://your-api-endpoint.com/upload', {
method: 'POST',
body: formData,
});
const result = await response.json();
console.log('Success:', result);
} catch (error) {
console.error('Error:', error);
}
};
return (
<form onSubmit={handleSubmit}>
<input type="file" onChange={handleFileChange} accept="image/*" />
{previewUrl && <img src={previewUrl} alt="Preview" style={{ maxWidth: '100%', maxHeight: '200px' }} />}
<button type="submit">Upload</button>
</form>
);
}
处理多文件上传
如果需要上传多张图片,可以通过multiple属性允许选择多个文件,并遍历文件列表进行处理。
import { useState } from 'react';
function MultipleImageUpload() {
const [selectedFiles, setSelectedFiles] = useState([]);
const handleFileChange = (event) => {
setSelectedFiles([...event.target.files]);
};
const handleSubmit = async (event) => {
event.preventDefault();
if (selectedFiles.length === 0) return;
const formData = new FormData();
selectedFiles.forEach((file) => {
formData.append('images', file);
});
try {
const response = await fetch('https://your-api-endpoint.com/upload', {
method: 'POST',
body: formData,
});
const result = await response.json();
console.log('Success:', result);
} catch (error) {
console.error('Error:', error);
}
};
return (
<form onSubmit={handleSubmit}>
<input type="file" onChange={handleFileChange} multiple accept="image/*" />
<button type="submit">Upload</button>
</form>
);
}
上传进度反馈
对于大文件上传,显示上传进度可以提升用户体验。通过axios的onUploadProgress属性实现进度跟踪。
import axios from 'axios';
import { useState } from 'react';
function ImageUploadWithProgress() {
const [selectedFile, setSelectedFile] = useState(null);
const [uploadProgress, setUploadProgress] = useState(0);
const handleFileChange = (event) => {
setSelectedFile(event.target.files[0]);
};
const handleSubmit = async (event) => {
event.preventDefault();
if (!selectedFile) return;
const formData = new FormData();
formData.append('image', selectedFile);
try {
const response = await axios.post('https://your-api-endpoint.com/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
onUploadProgress: (progressEvent) => {
const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
setUploadProgress(percentCompleted);
},
});
console.log('Success:', response.data);
} catch (error) {
console.error('Error:', error);
}
};
return (
<form onSubmit={handleSubmit}>
<input type="file" onChange={handleFileChange} />
<button type="submit">Upload</button>
{uploadProgress > 0 && <div>Progress: {uploadProgress}%</div>}
</form>
);
}






