uni-app 上传功能 uploader 服务器端代码怎么写?
uni-app 上传功能 uploader 服务器端代码怎么写?
http://demo.dcloud.net.cn/helloh5/uploader/upload.php文件是怎么实现上传的,它的具体代码谁有!
这个代码非常简单,你可以参考下:
<?php if ($_SERVER['REQUEST_METHOD'] == 'POST') { $ret=array('strings'=>$_POST,'error'=>'0'); $fs=array(); foreach ( $_FILES as $name=>$file ) { $fn=$file['name']; $ft=strrpos($fn,'.',0); $fm=substr($fn,0,$ft); $fe=substr($fn,$ft); $fp='files/'.$fn; $fi=1; while( file_exists($fp) ) { $fn=$fm.'['.$fi.']'.$fe; $fp='files/'.$fn; $fi++; } move_uploaded_file($file['tmp_name'],$fp); $fs[$name]=array('name'=>$fn,'url'=>$fp,'type'=>$file['type'],'size'=>$file['size']); } $ret['files']=$fs; echo json_encode($ret); }else{ echo "{'error':'Unsupport GET request!'}"; } ?>.net怎么实现
其实你用input type=file上传时,服务器怎么接收就怎么接收。你可以查下type=file时.net如何接收。
回复 DCloud_heavensoft:相同的上传代码,调用同一个nodejs服务端。为什么ios可以上传成功,安卓不行,提示连接中断。求指教
这个代码能运行么?谁试过了?我运行不了
这代码写的。。。。
我想把图片压缩后再上传怎么改此代码?
这段脚本对中文支持不友好
有没有nodejs的后台
给你们贡献一个.net后台的上传
public IHttpActionResult Post()
{
if (!Request.Content.IsMimeMultipartContent()) //如果不是文件类型 直接返回
{
return Ok();
}
var provider = new MultipartFormDataMemoryStreamProvider(); //文件流
try
{
var result = Task.Run(async () => await Request.Content.ReadAsMultipartAsync(provider)).Result;
string serviceCode = result.FormData.GetValues("serviceCode").FirstOrDefault();
string userId = result.FormData.GetValues("userId").FirstOrDefault();
string feedback = result.FormData.GetValues("feedback").FirstOrDefault();
foreach (var stream in result.Contents.Where((content, idx) => result.IsStream(idx))) {
var filename = stream.Headers.ContentDisposition.FileName.Replace("\"", "");
var ms = stream.ReadAsStreamAsync().Result;
var fileStorage = FileStorageFactory.CreateFileStorage(ms, filename, stream.Headers.ContentType.MediaType);
package.FileStorages.Add(fileStorage);
}
}
catch (Exception e)
{
return BadRequest();
}
return Ok("success");
}
public class MultipartFormDataMemoryStreamProvider : MultipartMemoryStreamProvider {
private readonly Collection<bool> _isFormData = new Collection<bool>();
private readonly NameValueCollection _formData = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
public NameValueCollection FormData {
get { return _formData; }
}
public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) {
if (parent == null) throw new ArgumentNullException("parent");
if (headers == null) throw new ArgumentNullException("headers");
var contentDisposition = headers.ContentDisposition;
if (contentDisposition != null) {
_isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName));
return base.GetStream(parent, headers);
}
throw new InvalidOperationException("Did not find required 'Content-Disposition' header field in MIME multipart body part.");
}
public override async Task ExecutePostProcessingAsync() {
for (var index = 0; index < Contents.Count; index++) {
if (IsStream(index))
continue;
var formContent = Contents[index];
var contentDisposition = formContent.Headers.ContentDisposition;
var formFieldName = UnquoteToken(contentDisposition.Name) ?? string.Empty;
var formFieldValue = await formContent.ReadAsStringAsync();
FormData.Add(formFieldName, formFieldValue);
}
}
private static string UnquoteToken(string token) {
if (string.IsNullOrWhiteSpace(token))
return token;
if (token.StartsWith("\"", StringComparison.Ordinal) && token.EndsWith("\"", StringComparison.Ordinal) && token.Length > 1)
return token.Substring(1, token.Length - 2);
return token;
}
public bool IsStream(int idx) {
return !_isFormData[idx];
}
}
```
后台的我也用的一般处理程序,但是不知道如何将前台的文件传给后台。看了官方的upload,但是没有成功。
折腾了一晚上,终于搞定了Java版本的,具体如下: 使用了Spring的框架+Apache的FileUpload,目前实现的版本为不支持断点续传。根据本人的经验,有几点需要注意: 1调试的时候使用debug的话会出现异常,导致文件接收不正常,如果需要调试的话,用sysout输出结果查看。 2前台使用addData传输的数据只能用字符串,貌似不支持数值型和其他类型的,否则使用request.getParameter()获取不到数据。 具体代码如下:
Map<String, Object> map = new HashMap<String, Object>();
if(request.getHeader(“content-type”)!=null&&“application/x-www-form-urlencoded”.equals(request.getHeader(“content-type”))){
return null;//不支持断点续传,直接返回null即可
}
//将请求转换成
MultipartHttpServletRequest mRequest=(MultipartHttpServletRequest)request;
Enumeration<String> ps = mRequest.getParameterNames();
while(ps.hasMoreElements()){
String hname = ps.nextElement();
System.out.println(hname);
System.out.println(mRequest.getParameter(hname));
}
int eventType=0;
int reportSource=0;
double longitude=0;
double latitude=0;
if(mRequest.getParameter(“eventType”)!=null||!"".equals(mRequest.getParameter(“eventType”).trim()))
eventType= Integer.parseInt(mRequest.getParameter(“eventType”));
if(mRequest.getParameter(“reportSource”)!=null||!"".equals(mRequest.getParameter(“reportSource”).trim()))
reportSource= Integer.parseInt(mRequest.getParameter(“reportSource”));
String reporter= mRequest.getParameter(“reporter”);
String phone= mRequest.getParameter(“phone”);
String title= mRequest.getParameter(“title”);
String description= mRequest.getParameter(“description”);
if(mRequest.getParameter(“longitude”)!=null||!"".equals(mRequest.getParameter(“longitude”).trim()))
longitude= Double.parseDouble(mRequest.getParameter(“longitude”));
if(mRequest.getParameter(“latitude”)!=null||!"".equals(mRequest.getParameter(“latitude”).trim()))
latitude= Double.parseDouble(mRequest.getParameter(“latitude”));
Iterator<String> fns=mRequest.getFileNames();//获取上传的文件列表
while(fns.hasNext()){
String s =fns.next();
System.out.println(s+"==="+mRequest.getFile(s));
// System.out.println(mRequest.getFile(s));//get file success!!!
MultipartFile mFile = mRequest.getFile(s);
if(mFile.isEmpty()){
map.put(“error”, “EventAction.picture.failed”);
}else{
String basePath=Constant.BASEPICUPLOADPATH;
String dPath= Constant.SDF_PARAM.format(new Date());
File dir = new File(basePath+dPath);
if(!dir.exists()){
dir.mkdirs();
}
String originFileName=mFile.getOriginalFilename();
String suffix=originFileName.split("\.")[originFileName.split("\.").length-1];
String base64Name=UUID.randomUUID().toString();
File file = new File(basePath+dPath,base64Name+"."+suffix);
try {
FileUtils.copyInputStreamToFile(mFile.getInputStream(),file);//存储文件
} catch (IOException e) {
e.printStackTrace();
}
}
}
//System.out.println(mRequest.getFileNames());
map.put(“result”, “OK”);//返回结果
return map;
}
我该咋使用呢…好难理解
你是用的什么方式做的java后台?
基于什么框架?
回复 fer2005:没有用框架,我想写一个servlet,然后使用tomcat做容器.我是一个菜鸟,第一次接触文件上传这一块,这边前端的我都懂了,就是服务端比较难搞定
servlet的话,你就在doPost方法里写上我上面的那段代码就可以了
回复 fer2005:额,我先研究一下,不懂的话再请教你哈,谢谢你大神
前台页面怎么弄的,我用的springMVC,后台的file获取不到,不知道是不是前台页面格式不对
回复 冰鱼:前台页面不能用<input type='file'/>的方式写,得用html5+的plus.uploader.createUpload进行上传处理
回复 fer2005:好的,谢谢,我已经调试成功了
struts框架代码咋弄呢。
Struts框架的应该跟spring是一样的,都是吧HttpServletRequest转成MultipartHttpServletRequest来实现
回复 黯淡星光:Struts2框架搞定了吗?分享下
回复 黯淡星光:Struts2后台怎么获取文件的?求分享,谢谢!
我也是用html5+的plus.uploader.createUpload,为什么程序一直返回是application/x-www-form-urlencoded了?MultipartHttpServletRequest这个对象也会一直报错
HTML5+的upload会发送两次请求,第一次的请求消息头为application/x-www-form-urlencoded,第二次才是真正的文件传输,所以需要如下处理:Map<String, Object> map = new HashMap<String, Object>(); if(request.getHeader(“content-type”)!=null&&“application/x-www-form-urlencoded”.equals(request.getHeader(“content-type”))){ return null;//此处直接返回null代表不支持断点续传 } // System.out.println(request.getHeader(“content-type”));
//第二次请求时强制转换request Enumeration<String> ps = mRequest.getParameterNames(); List<String> base64ParamNames=new ArrayList<String>(); while(ps.hasMoreElements()){//根据参数名称获取上传文件内容 String hname = ps.nextElement(); System.out.println(hname); // System.out.println(mRequest.getParameter(hname)); if(hname.startsWith(“uploadBase”)){ base64ParamNames.add(hname); } }
后台输出request.getHeader(“content-type”)是Multipart/form-data,但是MultipartHttpServletRequest 块还是报错…
@75973 你好,请问要加载什么jar包吗,怎么我使用你的代码会报错呢。而且有好几处错误
你好,struts接受addFile中的文件,接受不到呢?Iterator<String> fns=mRequest.getFileNames();
回复 fer2005:我也是用servlet写的,前台怎么调用呢plus.uploader.createUpload,sever写什么呢,写severlet接口,却进不到severlet方法里啊
回复 冰鱼:你好 请问你的Spring MVC 是怎么处理的
对啊,有没有java服务端代码,求大神贡献一下,我这搞三天了,还是不可以
多张图片服务器只能接收到最后一张 服务器接收文件参数requesparamter(name=“file”)multipartFile file【】files 前台上传的图片key的name属性全为file
我也遇到同样问题,请问你是怎么解决的
有没有.net 方面的资料,我尝试了几种都 没有成功。
你问他,他做过.net上传。http://ask.dcloud.net.cn/people/张工
c#
string dirPath = Server.MapPath("~/Temp/");
if (!Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
}
string filePath = dirPath + DateTime.Now.ToString(“yyyyMMddHHmmssffff”) + “.jpg”;
HttpPostedFileBase file = Request.Files[0];
file.SaveAs(filePath);
你好,我想问一下这段代码除了最后一句其余为什么会走两遍,是我前台代码的问题吗
这是app中的请求模式,第一遍请求是检查是否支持断点续传,第二遍才是上传文件!
后台我用的是.net写的 我通过这种方式为什么拿不到上传的文件?我通过取Request集合中的Files文件集合拿的 拿到文件数量为0
HttpFileCollection MyFilecollection = Request.Files;
int cout = MyFilecollection.Count;
MyFilecollection[0].SaveAs(Server.MapPath("~/upload/" + MyFilecollection[0].FileName));
这种方式又不是有问题啊?
问题解决了吗,能告诉我是怎么解决的吗
有没有ASP的啊
我的JAVA后台代码如下:
类头部设置的上传文件属性:
/**
RyanCai
上传文件属性
*/
private File picSearchfile; //上传的文件
private String picSearchfileFileName; //文件名称
private String picSearchfileContentType; //文件类型
方法体:
public void PicSelect() {
// 跨域访问设置作用域
setAccessControl();
// 获取用户输入的查询条件,并进行转码
Map<String, Object> map = new HashMap<String, Object>();
if (request.getHeader(“content-type”) != null
&& “application/x-www-form-urlencoded”.equals(request
.getHeader(“content-type”))) {
return;// 不支持断点续传,直接返回null即可
}
// 将请求转换成
String basePath = ServletActionContext.getServletContext()
.getRealPath("/files/picsearch");// 获取服务器路径
if (picSearchfile != null) {
File savefile = new File(new File(basePath), picSearchfileFileName);
if (!savefile.getParentFile().exists())
savefile.getParentFile().mkdirs();
try {
FileUtils.copyFile(picSearchfile, savefile);
} catch (IOException e) {
e.printStackTrace();
} //备份文件
}
map.put("result", "OK");// 返回结果
JSONObject json = JSONObject.fromObject(map);
outString(json.toString());
}
基本上就相当于普通的struts2文件上传处理。
那这个前台是怎么调用的呢,那个sever对应php文件还需要么,咋修改呢
task.addFile("_doc/1456976109430.jpg",{key:“file”}); //手机中的图片
这样后台接收不到请求
task.addFile(“img/1456976109430.jpg”,{key:“file”});//项目中的图片
这样后台接能收到请求
@fer2005,后台用你的写法出现了上面奇怪的现象,什么情况?
你的问题解决了吗?
请问上传是什么方式,可以使用jquery的Ajax代替吗。一直上传后台resteasy报错,想换种方式
有没有前端那段上传的代码啊
JAVA CODE
MultiPartRequestWrapper mulReq = (MultiPartRequestWrapper) request;
File file = mulReq.getFiles(“uploadImage”)[0]
String filename = mulReq.getFileNames(“uploadImage”)[0];
HTML CODE
task.addFile(imgPath,{key:“uploadImage”,name:imgname});
java具体怎么用啊,我试了试完全不能运行啊
@RequestMapping( “/fileUpload” )
public void fileUpload(@RequestParam (“file”) MultipartFile fileUpload,HttpServletRequest request,HttpServletResponse response){
SimpleDateFormat sFormat = new SimpleDateFormat(“yyyyMMddhhmmss” );
String fileName = sFormat.format(Calendar.getInstance().getTime())+ new Random().nextInt(1000);
String originalFilename = fileUpload.getOriginalFilename();
fileName += originalFilename.substring(originalFilename.lastIndexOf("." ));
String dirName = request.getSession().getServletContext().getRealPath("/" )+“fileUpload” ;
double originalFilesize = request.getContentLength();//获取源文件大小
File file = new File(dirName);
InputStream inputStream = null ;
FileOutputStream outputStream = null ;
if (!file.exists()) {
file.mkdir();
}
try {
inputStream = fileUpload.getInputStream();
if (!inputStream.equals(null)){
try {
//处理存储过程
System.out.println(“dirName”+dirName+"…"+“originalFilesize”+originalFilesize);
} catch (Exception e) {
e.printStackTrace();
}
}
outputStream = new FileOutputStream(dirName+"/" +fileName);
byte [] buffer = new byte[1024 * 1024];
int len=0;
while ((len=inputStream.read(buffer)) != -1){
outputStream.write(buffer, 0, len);
outputStream.flush();
}
outputStream.close();
inputStream.close();
}
catch (FileNotFoundException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}
////////////////
官方的uploader.html
42行把key:f.name 改成 key:"file"就行…跟@RequestParam (“file”) 里面的file要一样
task.addFile(f.path,{key:“file”});
js代码怎么写??
请问你这个能上传多张吗
就算加上[] 也是实现不了上传多张
addData()的数据, PHP怎么接收
感谢
.net 后台
接收数据 string strClient = Request[“client”];
接收文件
//客户端上传的文件集合
HttpFileCollection MyFilecollection = Request.Files;
for (int i = 0; i < MyFilecollection.Count; i )
{
HttpPostedFile FileInfo = MyFilecollection[i];
//FileInfo.FileName 是文件名
//FileInfo.SaveAs(filepath); 把图片保存到服务器路径
}
struts2 后台怎么接收啊,请大神指点一下
nodejs的有吗
有没有java的
还在研究中…
回复 suixing:请问文件上传java后台怎么写的你弄好了吗?求分享啊!!
回复 Allen梅川酷子:JAVA CODE MultiPartRequestWrapper mulReq = (MultiPartRequestWrapper) request; File file = mulReq.getFiles(“uploadImage”)[0] String filename = mulReq.getFileNames(“uploadImage”)[0];
回复 suixing:JAVA CODE MultiPartRequestWrapper mulReq = (MultiPartRequestWrapper) request; File file = mulReq.getFiles(“uploadImage”)[0] String filename = mulReq.getFileNames(“uploadImage”)[0];
HTML CODE task.addFile(imgPath,{key:“uploadImage”,name:imgname});
在处理 uni-app
的上传功能时,服务器端代码通常需要根据你所使用的后端技术栈来编写。以下是一些常见的后端技术栈(如 Node.js、Python Flask、Java Spring Boot)的服务器端代码示例,用于处理文件上传。
Node.js (Express)
首先,确保你已经安装了 multer
中间件,它是处理 multipart/form-data
类型请求的流行库。
const express = require('express');
const multer = require('multer');
const path = require('path');
const app = express();
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('file'), (req, res) => {
try {
const file = req.file;
if (!file) {
return res.status(400).send('No file uploaded.');
}
res.status(200).send({
fileName: file.filename,
path: `/uploads/${file.filename}`,
});
} catch (error) {
res.status(500).send(error.message);
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
Python Flask
在 Flask 中,你可以使用 flask-uploads
或标准的 request
对象来处理文件上传。
from flask import Flask, request, jsonify
import os
app = Flask(__name__)
UPLOAD_FOLDER = 'uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': 'No selected file'}), 400
file.save(os.path.join(UPLOAD_FOLDER, file.filename))
return jsonify({
'fileName': file.filename,
'path': f'/uploads/{file.filename}'
}), 200
if __name__ == '__main__':
app.run(port=3000)
Java Spring Boot
在 Spring Boot 中,你可以使用 @RestController
和 @PostMapping
来处理文件上传。
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@RestController
public class FileUploadController {
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ResponseEntity.badRequest().body("No file uploaded.");
}
try {
file.transferTo(new File("uploads/" + file.getOriginalFilename()));
return ResponseEntity.ok("File uploaded successfully: " + file.getOriginalFilename());
} catch (IOException e) {
return ResponseEntity.status(500).body(e.getMessage());
}
}
}
请根据你的后端技术栈选择相应的代码示例,并确保在 uni-app
客户端正确配置上传请求的 URL 和参数。