uni-app 上传功能 uploader 服务器端代码怎么写?

发布于 1周前 作者 nodeper 来自 Uni-App
75 回复

这个代码非常简单,你可以参考下:

<?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!'}"; } ?>

其实你用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();

@1289733871@qq.com:你struts的弄好了 求分享

回复 fer2005:我也是用servlet写的,前台怎么调用呢plus.uploader.createUpload,sever写什么呢,写severlet接口,却进不到severlet方法里啊

回复 冰鱼:你好 请问你的Spring MVC 是怎么处理的

简单的net后台上传操作,核心代码如下: context.Response.ContentType = “text/plain”;
string dirPath = context.Server.MapPath("~/Temp/");
if (!Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
}
try
{
HttpFileCollection files = context.Request.Files;
if (files.Count > 0)
{
for (int i = 0; i < files.Count; i++)
{
HttpPostedFile file = context.Request.Files[i];
string filePath = dirPath + file.FileName + “.jpg”;

                file.SaveAs(filePath);  
            }  
        }  
    }  
    catch (Exception e)  
    {  
        throw e;  
    }  

具体详见附件

对啊,有没有java服务端代码,求大神贡献一下,我这搞三天了,还是不可以

多张图片服务器只能接收到最后一张 服务器接收文件参数requesparamter(name=“file”)multipartFile file【】files 前台上传的图片key的name属性全为file

我也遇到同样问题,请问你是怎么解决的

有没有.net 方面的资料,我尝试了几种都 没有成功。

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,后台用你的写法出现了上面奇怪的现象,什么情况?

你的问题解决了吗?

struts2如何解析,哪位做出来了,指导一下

上传后前面会多出4行无用信息,自己处理掉后就可用了,这是我自己的处理方式,希望可以帮到大家。 File src = new File(rootPath+""+fileName+"."+postfix); File tgt = new File(rootPath+""+fileName+“temp”+"."+postfix); DataInputStream in = new DataInputStream(new FileInputStream(src)); DataOutputStream out = new DataOutputStream(new FileOutputStream(tgt)); String input = “”; int count = 0; while ((input = in.readLine()) != null) { count++; System.out.println(count); if (count < 4) { System.out.println(input); } else { break; } } byte[] buffer = new byte[1024]; int byteread = 0; while ((byteread = in.read(buffer)) != -1) { out.write(buffer, 0, byteread); }
in.close();
out.close();
FileUtil.copy(tgt.getCanonicalPath(),src.getCanonicalPath(),true) ;
tgt.delete() ;

请问上传是什么方式,可以使用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 后台怎么接收啊,请大神指点一下

请问一下 java的 后台接受类型是 CommonsMultipartFile ,每次只能接受一张,不能多张。

还在研究中…

回复 suixing:请问文件上传java后台怎么写的你弄好了吗?求分享啊!!

回复 Allen梅川酷子: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}); 这样就可以啊

回复 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 和参数。

回到顶部