html 保存文件指定路径,78.上传文件及在服务器保存文件到任意路径

上传文件到服务器是一个常用的操作,而在服务器上保存文件就需要多多用心了。因为你不可能只在一个路径里保存文件,所以需要实践一下保存文件到任意位置。当然,前提是你的应用程序有这样的操作权限。

首先建立一个main.go文件,作为项目的起点。并使用一个网页模板JoelUploadFile.html,作为操作界面。

c045c04d2210

代码目录结构

在main文件中,准备好页面路径、上传路径、文件访问路径等,及相对应函数

/**

* CofoxS

* @Author: Jian Junbo

* @Email: junbojian@qq.com

* @Create: 2019/3/30 22:25

* Copyright (c) 2019 Jian Junbo All rights reserved.

*

* Description:

*/

package main

import (

"fmt"

"goHttps/uilFileSys"

"html/template"

"log"

"net/http"

)

func main() {

fmt.Println("Hello Moon!")

log.Println("随意指定文件保存路径!")

//--页面路径

http.HandleFunc("/", IndexHandler)

//--上传文件

http.HandleFunc("/fileSys/tmpUpload/", uilFileSys.FileTmpUpload)

//----上传文件

http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("tmp"))))

websitename := ":90"

http.ListenAndServe(websitename, nil)

}

func IndexHandler(writer http.ResponseWriter, request *http.Request) {

//取消获取facicon.ico的访问

if request.RequestURI == "/facicon.ico" {

return

}

//---------绑定模板页 begin-------------

t, err := template.ParseFiles("./templatefile/JoelUploadFile.html")

if err != nil {

fmt.Println("发生了错误!")

fmt.Fprintln(writer, err)

}

t.ExecuteTemplate(writer, "JoelUploadFile.html", "")

//---------绑定模板页 end---------------

}

需要绑定的模板文件 JoelUploadFile.html

企业上传文件

input{

line-height: 20px;

padding-left: 2px;

padding-right: 2px;

margin-left: 2px;

margin-right: 2px;

background-color: #eaf4fc;

border-color: #b5c1e4;

border-width: 1px;

border-style: solid;

border-radius: 3px;

}

/*上传文件*/

.file {

position: relative;

display: inline-block;

background: #D0EEFF;

border: 1px solid #99D3F5;

border-radius: 4px;

padding: 4px 12px;

overflow: hidden;

color: #1E88C7;

text-decoration: none;

text-indent: 0;

line-height: 20px;

}

.file input {

position: absolute;

font-size: 100px;

right: 0;

top: 0;

opacity: 0;

}

.file:hover {

background: #AADFFD;

border-color: #78C3F3;

color: #004974;

text-decoration: none;

}

/*同步数据*/

function synkFile(srcObj, showObj, newObj) {

var srcO = document.getElementById(srcObj);

var showO = document.getElementById(showObj);

var new0 = document.getElementById(newObj);

/*if (srcO.value.length > 0) {

showO.value = srcO.value;

}

*/

// showO.value = "";

new0.innerText = "";

for (var i = 0; i < srcO.files.length; i++) {

// showO.value += srcO.files[i].name + "|";

new0.innerText += srcO.files[i].name + "|\r\n";

}

}

/*保存修改数据*/

function saveF() {

var frm = document.getElementById("formSave");

var u_id = document.getElementById("u_Id");

if (u_id.value.length <= 0) {

alert('\'流水号\'丢失!');

return;

}

frm.submit();

}

企业上传文件,按照“平台》企业编号》系统》年月日”来储存文件,文件名使用生成时间

style="width: 500px; display: none;" readonly>

上传附件

style="cursor: pointer"

οnchange="synkFile('uploadfile','u_ElectranicAttachment','new_ElectranicAttachment')">

style="display: none">

实现上传功能的函数

/**

* CofoxS

* @Author: Jian Junbo

* @Email: junbojian@qq.com

* @Create: 2019/3/31 23:27

* Copyright (c) 2019 Jian Junbo All rights reserved.

*

* Description: 企业文件管理

*/

package uilFileSys

import (

"cofoxWebPlatform/platform/lib"

"cofoxWebPlatform/platform/model"

"encoding/json"

"fmt"

"io"

"net/http"

"os"

"path"

)

//上传文件到临时文件路径,前提条件是当前用户是在线用户

func FileTmpUpload(writer http.ResponseWriter, request *http.Request) {

//接收数据

keyId := request.FormValue("keyId") //key身份Id

//get a ref to the parsed multipart form

m := request.MultipartForm

//get the *fileheaders

files := m.File["uploadfile"]

for i,_ := range files {

//save the file as filename

filename := lib.JoelGetNowFullTimeNumber() + path.Ext(files[i].Filename)

//for each fileheader, get a handle to the actual file

file, err := files[i].Open()

defer file.Close()

if err != nil {

http.Error(writer, err.Error(), http.StatusInternalServerError)

return

}

//create destination file making sure the path is writeable.

dst, err := os.Create("./tmp/" + filename)

defer dst.Close()

if err != nil {

http.Error(writer, err.Error(), http.StatusInternalServerError)

return

}

//copy the uploaded file to the destination file

if _, err := io.Copy(dst, file); err != nil {

http.Error(writer, err.Error(), http.StatusInternalServerError)

return

}

tmpfile := dst.Name() // 写入保存文件的位置和文件名

lib.JoelLog(keyId,tmpfile) //服务端输出

resultValue := model.JoelBaseAskResultNormal{}

resultValue.AskResult = tmpfile

back,_ := json.Marshal(resultValue)

fmt.Fprint(writer,string(back)) //返回客端数据

}

}

运行此程序

c045c04d2210

服务器显示

c045c04d2210

浏览器显示

点击“上传附件”,选择要上传的文件。

c045c04d2210

选择一个图片文件

点击“保存”按钮,激发js的saveF()函数,提交form到服务器

c045c04d2210

一般都会顺带提交一些其他数据,例如:u_Id

提交后,文件保存到 "/tmp/" 路径,这个路径在当前程序的根上。

c045c04d2210

已上传到服务器的文件

c045c04d2210

服务器返回的json串

下面可以指定保存的其他路径

当前文件保存的位置是 tmp 路径,是在 \uilFileSys\EntFileMS.go 中定义的

//create destination file making sure the path is writeable.

dst, err := os.Create("./tmp/" + filename)

用windows系统来举例,如果我希望文件保存在另一个位置,比如:e盘,这行代码只需要修改为

//create destination file making sure the path is writeable.

dst, err := os.Create("e://" + filename)

如果,你上传之后,还想能够通过浏览器访问到这个文件,那么在 main.go 中,有这样的一行代码

//----上传文件

http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("tmp"))))

你需要把它改成

//----上传文件

http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("e:\\"))))

至此,大功告成!你已经可以把文件上传到 e 盘了。

在此基础上,你应该可以动态的指定每次上传文件的物理路径了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel表格中添加combobox_Excel中两个表格对比,找出不同数据

当你有两个Excel工作簿需要对比数据时候&#xff0c;你该怎么做呢&#xff1f;数据少&#xff0c;我们直接用眼睛就可以看到&#xff0c;数据如果太多&#xff0c;那么对比找出不同数据&#xff0c;是一件非常困难的事情。今天&#xff0c;小汪老师就来教大家几招&#xff0c;可…

计算机算法音乐专业,音乐信号分析算法的乐理简说(非音乐专业的乐理)

前言这篇文章不是讲乐理知识的&#xff0c;那是音乐制作人&#xff0c;编曲人员所需要钻研的学问&#xff0c;不过你要有兴趣也可以看看专业的乐理知识。这里仅仅是说在音乐信号分析的项目中&#xff0c;我们需要知道的一些参数的意义。在诸多信号处理&#xff0c;或图像处理算…

代码改变世界,也改变了我

愿2021的你&#xff0c;可以勇敢的踏出那一步&#xff0c;可以去追求自己想要的东西。脑图版代码版using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp14 {internal class Program{pr…

计算机基础与应用教程计算机硬件,计算机基础系列一:计算机硬件

1、编程语言的作用及与操作系统和硬件的关系一个完整的计算机系统包括硬件、操作系统、软件(即程序员开发的各种软件)三部分组成。各程序员开发的软件若直接调用计算机的硬件&#xff0c;如硬盘读取、音频播放等&#xff0c;则软件不仅编写复杂同时影响开发效率&#xff0c;因此…

宝塔mysql远程链接_宝塔apache启动失败:报错 AH00526: Syntax error on line 解决方案

错误信息&#xff1a;AH00526: Syntax error on line 54 of /www/server/apache/conf/httpd.conf:Cannot define multiple Listeners on the same IP:port朋友网站突然访问不了&#xff0c;进入宝塔后查看Apache服务器没运行&#xff0c;重启Apache时提示这个错误信息打开Apach…

C#-WinForm跨线程修改UI界面

背景在我做WinForm开发的过程中&#xff0c;经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死&#xff0c;严重影响软件的使用。因此&#xff0c;这类耗时或阻塞的操作一般都会使用异步的方式去执行&#xff0c;不影响主线程&#xff08;UI线程&#xff09;与用户间…

长春工业大学计算机科学与技术录取分数,2021年长春工业大学各省各专业最低投档录取分数线统计(文科 理科)...

2018年长春工业大学各省各专业最低投档录取分数线统计(文科 理科)同学们2019年高考是你们人生旅途的第一个加油站&#xff0c;它意味着你们的希望&#xff0c;你们的前途&#xff0c;甚至是命运&#xff0c;挑战六月就是挑战命运和未来&#xff0c;希望你们在高考中脱颖而出&am…

.NET 5 开源工作流框架elsa技术研究

编者注&#xff1a; 工作流框架 elsa 是.NET基金会下面的开源项目&#xff0c;2.0版本即将在3月份发布&#xff0c;目前正在紧锣密鼓的开发之中&#xff0c;2020年2月份我也介绍过推荐一个很棒的开源工作流elsa-core &#xff0c;今天给大家推荐MVP 周国庆写的这篇详细文章。今…

php 清空一个数组_PHP工程师学Python数据类型

一、背景继上篇文章比较了PHP与Python语法之后&#xff0c;这周又学习了Python数据类型&#xff0c;准备从通过这篇文章给自己进行一些总结&#xff0c;也给其他读者一些参考。二、内容概要字符串(str)列表(list)元组(tup)字典(dict)数据操作三、字符串(str)Python中字符串操作…

“开源、共享、创新” 2020 中国.NET开发者大会小结

大会的新闻稿在2020年12月31日正式发布&#xff1a;开源共享创新|2020年中国.NET开发者大会圆满收官&#xff01; , 本文是这篇新闻的补充性文章&#xff0c;仅代表个人对大会的各方面分享内容的一个小结。在2019年上海中国.NET开发者大会的基础上&#xff0c;2020年12月19日 继…

maya的颤动怎么做_必看!新手学习MAYA的几个建议

“学习是没有捷径可言的&#xff0c;唯一的捷径就是不断的学习和练习&#xff0c;只有这样才能学到真功夫”Maya设计刚刚开始接触Maya的同学都会有这些疑问&#xff0c;我适不适合学习Maya&#xff0c;学习Maya可以赚到钱吗&#xff1f;怎样才可以学好Maya&#xff0c;今天给大…

我的2020年终总结:新的角色,新的开始

【年终总结】| 作者/Edison Zhou又到了一年一度的年终盘点时刻&#xff0c;熟悉我的朋友应该都知道&#xff0c;这个时候我都会写一篇推文盘点一下这一年来的得失。1也谈2020关键事件回顾&#xff08;1&#xff09;扯证了&#xff0c;结婚了要说2020年我个人的最大里程碑&#…

docker es持久化_使用docker数据卷对容器数据持久化

volume是用于对Docker容器生成和使用的数据持久化的首选机制。如果您的容器生成非持久状态数据&#xff0c;请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方&#xff0c;并通过避免写入容器的可写层来提高容器的性能。默认容器的数据存储在这里我们在容器中创建一些模拟的…

求职信计算机工程师英语作文,开发工程师英文求职信范文

开发工程师英文求职信范文respected leaders:hello:first salute you sincere thanks, thank you for taking the time to consult the of my application letter!i am aptech a student, now already graduated from junior year. major in.net direction, and ismitted to be…

微信适配国产操作系统:原生支持 Linux

喜欢就关注我们吧&#xff01;据 ZOL 报道&#xff0c;统信软件官方近日宣布上线适配统信 UOS 的微信桌面客户端&#xff0c;并称该微信版本为原生支持 Linux 的版本&#xff0c;同时支持龙芯、鲲鹏、麒麟等国产 CPU。据悉&#xff0c;统信 UOS 版的微信桌面客户端由腾讯公司研…

ML.NET生成器带来了许多错误修复和增强功能以及新功能

ML.NET是一个开源的跨平台机器学习框架&#xff0c;适合 .NET 开发人员。它允许将机器学习集成到 .NET 应用中&#xff0c;而无需离开 .NET 生态系统&#xff0c;甚至拥有 ML 或数据科学背景。ML.NET工具&#xff08;Visual Studio 中的 UI 模型生成器和跨平台 ML.NET CLI&…

Flash 生命终止,HTML5能否完美替代?

Adobe 对 Flash Player 的支持计划在今天&#xff0c;也就是 2020 年 12 月 31 日终止。Windows 计算机上最新版本的 Flash Player 已经开始弹出生命周期终止提示窗口。提示中指出&#xff0c;为了保护用户系统&#xff0c;Adobe 将在 2021 年 1 月 12 日开始禁止 Flash 内容在…

typora公式zuo对齐_Markdown编辑神器-Typora

Markdown For Typora Overview Markdown is created by Daring Fireball, the original guideline is here. Its syntax, however, varies between different parsers or editors. Typora is using [GitHub Flavored Markdown][GFM]. 注:Markdown语法与知乎不能完全兼容,显示…

使用 ML.NET 识别乐高颜色块

每一个乐高迷都拥有很多的颜色块&#xff0c;需要进行排序和按类型分拣&#xff0c;按照《Organizing your LEGO Bricks》或许有所帮助&#xff0c;但这不是一个简单的任务&#xff0c;因为有很多颜色块有非常微妙的差异。如果换作一个典型的程序员可以做什么来解决这个问题呢&…